У меня есть абстрактный базовый класс, и я хочу объявить поле или свойство, которое будет иметь другое значение в каждом классе, который наследуется от этого родительского класса.
Я хочу определить его в базовом классе, поэтому я могу ссылаться на него в методе базового класса - например, переопределить ToString, чтобы сказать "Этот объект имеет тип property/field". У меня есть три способа, которые я могу видеть в этом, но мне было интересно - какой лучший или приемлемый способ сделать это? Новый вопрос, извините.
Вариант 1:
Используйте абстрактное свойство и переопределите его в унаследованных классах. Это может быть принудительным (вы должны переопределить его), и это чисто. Но, кажется, немного неправильно возвращать значение жесткого кода, а не инкапсулировать поле, и это несколько строк кода, а не просто. Я также должен объявить тело для "набора", но это менее важно (и, вероятно, есть способ избежать того, чего я не знаю).
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, поскольку он является единственным безопасным вариантом, но я просто разбираюсь с С# и хотел спросить об этом людей с большим опытом.