Ho una classe base astratta e voglio dichiarare un campo o una proprietà che avrà un valore diverso in ogni classe che eredita da questa classe genitore.
Voglio definirlo nella baseclass in modo da poterlo fare riferimento in un metodo di classe base - ad esempio sovrascrivendo ToString per dire "Questo oggetto è di tipo proprietà / campo ". Ho tre modi in cui posso vedere di farlo, ma mi chiedevo: qual è il modo migliore o accettato per farlo? Domanda per principianti, scusa.
Opzione 1:
utilizzare una proprietà astratta e sovrascriverla sulle classi ereditate. Questo beneficia di essere applicato (devi sovrascriverlo) ed è pulito. Tuttavia, sembra leggermente sbagliato restituire un valore di codice fisso anziché incapsulare un campo ed è poche righe di codice anziché solo. Devo anche dichiarare un corpo per "set" ma questo è meno importante (e probabilmente c'è un modo per evitare ciò di cui non sono a conoscenza).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Opzione 2
Posso dichiarare un campo pubblico (o un campo protetto) e sostituirlo esplicitamente nella classe ereditata. L'esempio che segue mi avvertirà di usare "nuovo" e probabilmente posso farlo, ma sembra sbagliato e rompe il polimorfismo, che era il punto. Non sembra una buona idea ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Opzione 3
Posso usare un campo protetto e impostare il valore nel costruttore. Questo sembra abbastanza ordinato ma si basa su di me per garantire che il costruttore lo imposti sempre e con più costruttori sovraccaricati c'è sempre la possibilità che un percorso del codice non imposti il valore.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
È un po 'una domanda teorica e immagino che la risposta debba essere l'opzione 1 in quanto è l'unica opzione sicura , ma sto solo facendo i conti con C # e volevo chiederlo a persone con più esperienza.