2010-05-25 10 views
14

Dopo un po 'di programmazione, una delle mie lezioni utilizzava i farmaci generici in un modo che non avevo mai visto prima. Vorrei alcune opinioni su questo, se è male codifica o meno.Uso strano di generici

abstract class Base<T> : where T : Base<T> 
{ 
    // omitted methods and properties. 
    virtual void CopyTo(T instance) { /*code*/ } 
} 

class Derived : Base<Derived> 
{ 
    override void CopyTo(Derived instance) 
    { 
     base.CopyTo(instance); 
     // copy remaining stuff here 
    } 
} 

questo è un uso OK di generici o no? Sto principalmente pensando al vincolo a "se stesso". A volte mi sembra che i generici possano "esplodere" in altre classi dove uso la classe Base.

+4

In realtà non è molto raro, l'ho visto prima ... –

+0

Ecco a cosa servono i generici. Probabilmente dovrei esporre un'interfaccia per renderla ancora più astratta. –

+0

Perché è necessario che il tipo T sia una base ? Non ho visto alcuna ragione per questo nel tuo campione, in realtà non riesco a capire perché lo stai usando, è tutto quello che mi manca? –

risposta

9

Sì, questo è ragionevole - Ho qualcosa di simile nella mia porta Protocol Buffers (eccetto che è più complicato, in quanto vi sono due tipi di riferimento reciproco).

Hai assolutamente ragione sui generici che a volte finiscono per diffondersi nel codice-base: ciò che hai fatto qui significa che i bit di codice che si preoccupano solo dell'API Derived non devono preoccuparsi dei generici .

Il mio consiglio è di cercare di mantenerlo semplice laddove possibile, ma nei casi in cui un vincolo generico "dispari" descrive realmente ciò che si desidera, provaci. È necessario essere consapevoli che questo non forza uso valida anche se - si potrebbe facilmente avere:

class Banana : Base<Derived> 

e che sarebbe valida, anche se strano e probabilmente inaspettata per gli utenti.

Si potrebbe anche voler considerare la sigillatura di Derived qui - se si ottiene ulteriormente, si rischia di nuovo con un comportamento strano (o almeno un'API dispari).

+0

Jon, non avrebbe Banana: Base fallire? Poiché 'dove T: Base '? –

+1

@Filip Ekberg, no, funziona, dal momento che T = 'Derivato', e' Derivato' è un 'Base ' –

+0

Ah sembrava un po 'strano :) –