У меня есть абстрактный базовый класс, и я хочу объявить поле или свойство, которое будет иметь другое значение в каждом классе, который наследуется от этого родительского класса.Переопределение полей или свойств в подклассах
Я хочу определить его в базовом классе, поэтому я могу ссылаться на него в методе базового класса - например, переопределить 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, поскольку это единственный вариант безопасного, но я просто получаю схватиться с C# и хотел спросить, это люди с больше опыта.
Static - это плохой выбор слов, поскольку он подразумевает, что значение распределяется между всеми экземплярами класса, что, конечно же, не является. – 2008-11-28 17:11:45
Это правда. Я отредактирую его. – Ant 2009-01-09 14:43:31