Что я должен делать, когда каждый унаследованный класс нуждается в получателе из базового класса, но установщик только для одного наследуемого класса

У меня есть абстрактный класс под названием 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();
}
Другие вопросы по тегам