Come evitare di avere nidificato in classe

2

Sto lavorando a un progetto parallelo e ho attivato tutte le regole per l'analisi del codice in Visual Studio e ho ricevuto l'avviso:

Warning CA1006 Consider a design where 'Vote<T>.CalculateWinner(List<Vote<T>>)' doesn't nest generic type 'List<Vote<T>>'

E indica davvero un punto dolente nel mio design. Ho una classe base astratta Vote<T> che contiene un elenco delle opzioni per eseguire un'elezione sul tipo T .

Ecco cosa voglio esistere:

Esistono tre tipi di oggetti, PolicyCategory , Policy e Funding . Un PolicyCategory contiene un elenco di voti sulle politiche al suo interno e un voto su Policy deve contenere anche un elenco di voti su un oggetto Funding . La procedura elettorale (sembra essere STV) viene quindi eseguita sui voti nella categoria e quindi sui voti sulla politica vincente. La procedura è la stessa per entrambi i tipi di voti.

Quello che ho ora è PolicyVote : Vote<Policy> e FundingVote : Vote<Funding> , la logica di elezione principale è in Vote<T> , e ho metodi che lanciano List<PolicyVote> in List<Vote<Policy>> , e poi chiamiamo Vote<T>.CalculateWinner() .

Questo è chiaramente piuttosto orribile dato che sto violando la mancanza di controvarianza in C #.

Come può essere migliorato?

    
posta soandos 31.01.2016 - 04:11
fonte

1 risposta

1

Prenderò in considerazione l'utilizzo di interface per il voto anziché la genetica.

In questo modo se hai qualcosa di simile:

interface IVote {
// your interface requirements
}

E poi sulle tue definizioni di classe implementa l'interfaccia IVote :

class PolicyVote : IVote {// class def.
}

class FundingVote : IVote { 
    //class def
}

//etc. 

Potresti quindi evitare di eseguire il casting su Vote<T> e usare IVote come tipo e ogni classe che implementa IVote verrà riconosciuta dal compilatore come sicura:

public static int CalculateWinner(List<IVote> votes) {
// your calc logic
}

//You can now pass any object that implements 'IVote' to the method
//assuming policyVotes and fundingVotes are type List<IVote>
CalculateWinner(policyVotes); // this will work
CalculateWinner(fundingVotes); // so will this 
    
risposta data 31.01.2016 - 06:04
fonte

Leggi altre domande sui tag