У меня есть абстрактный базовый класс, и я хочу объявить поле или свойство, которое будет иметь другое значение в каждом классе, наследуемом от этого родительского класса.
Я хочу определить его в базовом классе, чтобы я мог ссылаться на него в методе базового класса - например, переопределив ToString, чтобы сказать: «Этот объект имеет тип свойство / поле». У меня есть три способа сделать это, но мне было интересно - какой способ сделать это лучше или приемлемее? Вопрос новичка, извините.
Вариант 1.
Используйте абстрактное свойство и переопределите его в унаследованных классах. Это выигрывает от того, что оно принудительно (вы должны его переопределить), и оно чистое. Но кажется немного неправильным возвращать значение жесткого кода вместо того, чтобы инкапсулировать поле, и это несколько строк кода, а не просто. Я также должен объявить тело для "set", но это менее важно (и, вероятно, есть способ избежать того, о чем я не знаю).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Вариант 2
я могу объявить общедоступное поле (или защищенное поле) и явно переопределить его в унаследованном классе. Приведенный ниже пример предупредит меня об использовании слова «новый», и я, вероятно, смогу это сделать, но это кажется неправильным и нарушает полиморфизм, в чем и заключалась вся суть. Не похоже на хорошую идею ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Вариант 3
я могу использовать защищенное поле и установить значение в конструкторе. Это кажется довольно аккуратным, но я полагаюсь на то, что конструктор всегда устанавливает это, а с несколькими перегруженными конструкторами всегда есть шанс, что какой-то путь кода не установит значение.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
Это немного теоретический вопрос, и я думаю, что ответ должен быть в варианте 1, поскольку это единственный безопасный вариант, но я только начинаю разбираться в C # и хотел спросить об этом людей с большим опытом .