Что я должен делать, когда каждый унаследованный класс нуждается в получателе из базового класса, но установщик только для одного наследуемого класса
У меня есть абстрактный класс под названием WizardViewModelBase.
Все мои классы WizardXXXViewModel наследуются от базового абстрактного класса.
База имеет свойство с добытчиком. Каждый подкласс нуждается и переопределяет эту строку
свойство как его DisplayName ViewModel.
Только ОДНА ViewModel с именем WizardTimeTableWeekViewModel нуждается в установщике, потому что я должен установить
Является ли ViewModel расписанием для недели A или недели B. Использование двух моделей представления, таких как
WizardTimeTableWeekAViewModel и WizardTimeTableWeekBViewModel будут избыточными.
Я не хочу переопределять сеттер во всех других классах, так как им не нужен сеттер.
Могу ли я как-то сказать подклассу, что он не должен переопределять сеттер?
Или любое другое предложение?
С интерфейсами я мог бы свободно использовать геттер или сеттер, но имея много пустых сеттеров
свойства не вариант для меня.
Забавно... Я только что подумал, что произойдет, если мне действительно нужно будет установить все DisplayNames на WizardPages вопреки тому, что я сказал в первую очередь. Может быть, мне не следует жестко кодировать строки в геттере и помещать строки в файл ресурсов из-за локализации, тогда мне нужен установщик в любом месте каждого подкласса XD
4 ответа
Не объявляйте метод сеттера как виртуальный.
Если по какой-то причине (я не могу придумать одну!) Вам нужно, чтобы она была виртуальной на вершине иерархии наследования, тогда используйте overled, когда вы ее переопределите:
http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx
Если свойство не является абстрактным, то любой базовый класс может переопределить только установщик, получатель или оба.
Если вы хотите, чтобы ваши подклассы не имели доступа к вашему установщику, за исключением только данного подкласса, вы можете использовать внутренний модификатор доступа только к получателю и реализовывать классы, которые не должны иметь доступа к установщику в другой сборке.
Вы должны ввести новый абстрактный класс, который будет встроен в класс WizardViewModelBase. Этот класс должен переопределить свойство, используя методы доступа get и set, но оставит свойство абстрактным, например:
public abstract string DisplayName
{
get;
set;
}
Затем вы можете использовать этот класс в качестве базового класса для класса WizardTimeTableWeekViewModel, и вы сможете переопределять методы доступа get и set.
Я бы использовал защищенный установщик и создал бы отдельную функцию для установки значения. В конце концов, у класса нет того же интерфейса, что и у других, поэтому его визуальное отличие от других должно способствовать удобочитаемости.
class Base
{
public String Value { get; protected set; }
}
class SpecialChild : Base
{
public void SetValue(String newValue) { this.Value = newValue; }
}
// Somewhere else
SpecialChild special = foo as SpecialChild;
if (special != null)
{
special.SetValue('newFoo');
}
else
{
foo.DoSomeStuff();
}