Ich habe eine abstrakte Basisklasse und möchte ein Feld oder eine Eigenschaft deklarieren, die in jeder Klasse, die von dieser übergeordneten Klasse erbt, einen anderen Wert hat.
Ich möchte es in der Basisklasse definieren, damit ich es in einer Basisklassenmethode referenzieren kann - zum Beispiel, wenn ToString überschrieben wird, um zu sagen, dass dieses Objekt vom Typ Eigenschaft / Feld ist . Ich habe drei Möglichkeiten, wie ich das sehen kann, aber ich habe mich gefragt - was ist die beste oder akzeptierte Art, dies zu tun? Neuling Frage, sorry.
Option 1:
Verwenden Sie eine abstrakte Eigenschaft und überschreiben Sie sie für die geerbten Klassen. Dies profitiert von der Durchsetzung (Sie müssen es überschreiben) und es ist sauber. Es fühlt sich jedoch etwas falsch an, einen Hardcode-Wert zurückzugeben, anstatt ein Feld zu kapseln, und es sind ein paar Codezeilen statt nur. Ich muss auch einen Körper für "set" deklarieren, aber das ist weniger wichtig (und es gibt wahrscheinlich einen Weg, das zu vermeiden, was mir nicht bekannt ist).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Option 2
Ich kann ein öffentliches Feld (oder ein geschütztes Feld) deklarieren und es in der geerbten Klasse explizit überschreiben. Das folgende Beispiel gibt mir eine Warnung, "neu" zu verwenden, und ich kann das wahrscheinlich tun, aber es fühlt sich falsch an und bricht den Polymorphismus, worum es ging. Scheint keine gute Idee zu sein ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Option 3
Ich kann ein geschütztes Feld verwenden und den Wert im Konstruktor festlegen. Dies scheint ziemlich ordentlich zu sein, aber ich muss sicherstellen, dass der Konstruktor dies immer festlegt. Bei mehreren überladenen Konstruktoren besteht immer die Möglichkeit, dass ein Codepfad den Wert nicht festlegt.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
Es ist eine theoretische Frage, und ich denke, die Antwort muss Option 1 sein, da dies die einzig sichere Option ist, aber ich habe gerade C # in den Griff bekommen und wollte dies Leuten mit mehr Erfahrung stellen.