Considerate accettabile o una cattiva pratica creare una classe generica astratta che prende come parametro di tipo una classe che deriva da se stessa?Classi generiche astratte che assumono parametri di tipo derivati da quella classe
Ciò consente alla classe generica astratta di manipolare le istanze della classe derivata e in particolare la possibilità di creare nuove() istanze della classe derivata come necessario e può aiutare a evitare la ripetizione del codice nelle classi concrete che ne derivano.
Se "cattivo" quale alternativa preferisci gestire tali situazioni e in che modo strutturerai il codice qui sotto?
Ad esempio: -
// We pass both the wrapped class and the wrapping class as type parameters
// to the generic class allowing it to create instances of either as necessary.
public abstract class CoolClass<T, U>
where U : CoolClass<T, U>, new()
{
public T Value { get; private set; }
protected CoolClass() { }
public CoolClass(T value) { Value = value; }
public static implicit operator CoolClass<T, U>(T val)
{
// since we know the derived type and that its new(), we can
// new up an instance of it (which we couldn't do as an abstract class)
return new U() { Value = val};
}
public static implicit operator T(CoolClass<T, U> obj)
{
return obj.Value;
}
}
E una seconda domanda bonus: perché uno di questi operatori implicita di lavoro e l'altro non uno?
ad es.
public class CoolInt : CoolClass<int, CoolInt>
{
public CoolInt() { }
public CoolInt(int val) (val) { }
}
// Why does this not work
CoolInt x = 5;
// when this works
CoolInt x2 = (CoolInt)5;
// and this works
int j = x;
E la domanda sui parametri di tipo generico? (Avrei dovuto porre la domanda implicita in una domanda a parte perché è un po 'una distrazione per la domanda principale.) –
Ho aggiornato la risposta. –
+1 ma non sono d'accordo con la disapprovazione dei cast impliciti.Non esiste un codice che non possa essere scoperto senza l'analisi statica o l'uso esperto del debugger; e come sviluppatore mi aspetto di doverlo fare per analizzare codice più complesso. Il complesso non è male. In questo caso sta rendendo il consumatore della classe più capace di fare ciò che vuole. –