Mam abstrakcyjną klasę bazową i chcę zadeklarować pole lub właściwość, która będzie miała inną wartość w każdej klasie, która dziedziczy z tej klasy nadrzędnej.
Chcę zdefiniować go w klasie bazowej, aby móc odwoływać się do niego w metodzie klasy bazowej - na przykład przesłaniając ToString, aby powiedzieć „Ten obiekt jest typu property / field ”. Mam trzy sposoby na zrobienie tego, ale zastanawiałem się - jaki jest najlepszy lub akceptowany sposób zrobienia tego? Pytanie dla początkujących, przepraszam.
Opcja 1:
Użyj właściwości abstrakcyjnej i zastąp ją w klasach dziedziczonych. Korzysta z tego, że jest wymuszony (musisz to zmienić) i jest czysty. Ale wydaje się nieco niewłaściwe zwracanie wartości kodu stałego zamiast hermetyzacji pola i jest to kilka wierszy kodu zamiast tylko. Muszę też zadeklarować ciało dla „zestawu”, ale jest to mniej ważne (i prawdopodobnie jest sposób na uniknięcie tego, czego nie jestem świadomy).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Opcja 2
Mogę zadeklarować pole publiczne (lub pole chronione) i jawnie nadpisać je w dziedziczonej klasie. Poniższy przykład ostrzega mnie przed użyciem słowa „nowy” i prawdopodobnie mogę to zrobić, ale wydaje mi się to złe i łamie polimorfizm, o który chodziło. To nie jest dobry pomysł ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Opcja 3
Mogę użyć chronionego pola i ustawić wartość w konstruktorze. Wydaje się to całkiem uporządkowane, ale polega na tym, że konstruktor zawsze to ustawia, a przy wielu przeciążonych konstruktorach zawsze istnieje szansa, że jakaś ścieżka kodu nie ustawi wartości.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
To trochę teoretyczne pytanie i wydaje mi się, że odpowiedzią musi być opcja 1, ponieważ jest to jedyna bezpieczna opcja, ale dopiero zaczynam uporać się z C # i chciałem zapytać o to osoby z większym doświadczeniem.