considerare le seguenti classi:metodo astratto con tipo di ritorno fortemente tipizzato
public abstract class Animal
{
public abstract Animal GiveBirth();
}
public class Monkey : Animal
{
public override Animal GiveBirth()
{
return new Monkey();
}
}
public class Snake : Animal
{
public override Animal GiveBirth()
{
return new Snake();
}
}
//That one doesnt makes sense.
public class WeirdHuman: Animal
{
public override Animal GiveBirth()
{
return new Monkey();
}
}
sto cercando un modo per far rispettare le tipologie di ritorno del metodo overrided GiveBirth
in modo che restituisca sempre il tipo di classe attuale, in modo che no WeirdHuman
può dare alla luce un Monkey
.
Mi sembra che la risposta riguardi i tipi generici, ma non riesco a vedere come posso farlo.
Esempio del risultato atteso:
public abstract class Animal
{
public abstract /*here a way to specify concrete type*/ GiveBirth();
}
public class Monkey : Animal
{
public override Monkey GiveBirth() //Must returns an actual Monkey
{
return new Monkey();
}
}
"Assolutamente impossibile" può essere una risposta, se chiaramente spiegato.
Questo è quello che pensavo. Non riesco a vedere alcun modo per specificare che il tipo generico deve implementare il tipo di classe effettivo. Come "dove T: questo" o qualcosa del genere ... – Johnny5
Quali sono le lingue che lo supportano? – Johnny5
Java lo supporta. Niente .Net lo supporta poiché il CLR è il problema di fondo. Speriamo che una versione futura aggiungerà supporto, ma, a quanto ho capito, ci vorrebbe un cambiamento sostanziale per farlo funzionare. –