2010-06-03 2 views
1

У меня есть абстрактный класс WizardViewModelBase.C# - Что делать, если каждому унаследованному классу нужен getter из базового класса, но setter только для ONE унаследованного класса

Все мои классы WizardXXXViewModel наследуют от базового абстрактного класса.

База имеет имущество с газопоглотителем. Каждый подкласс требует и переопределяет эту строку

Свойство как его DisplayName ViewModel.

только ОДИН ViewModel называется WizardTimeTableWeekViewModel нужен сеттер, потому что я должен установить

кастрированный баран модели представления является график неделю или неделю B. Использование 2 ViewModels как

WizardTimeTableWeekAViewModel и WizardTimeTableWeekBViewModel будет излишним.

Я не хочу переопределять сеттер во всех других классах, так как они не нуждаются в сеттере.

Могу ли я как-то сказать подклассу, что ему не нужно переопределять сеттер?

Или любое другое предложение?

С интерфейсами я бы свободно использовать геттер или сеттер, но имеющие много пустого сеттера

свойства не вариант для меня.

Забавно .. Я только подумал, что произойдет, если мне действительно понадобится установить все отображаемые имена WizardPages вопреки сказанному мной. Возможно, мне не нужно жестко кодировать строки в getter и помещать строки в файл reesource из-за локализации, тогда мне нужен установщик в любом месте в каждом подклассе XD.

+1

Пожалуйста, пост код ... – Stefan

ответ

1

Не объявляйте метод setter как виртуальный.

Если по какой-то причине (я не могу думать об одном!) Вам нужно для того, чтобы быть виртуальными в верхней части иерархии наследования затем использовать запечатанный при ее перекрытии:

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

+0

Я использую это сейчас: Виртуальное унаследованное свойство может быть переопределен в производном классе, включив в декларацию об имуществе, которое использует модификатор переопределения. Гораздо лучше, чем опечатано => Базовый класс: общедоступная виртуальная строка DisplayName {get; задавать; } Подкласс: приватная строка _displayName; public override string DisplayName { get {return _displayName; } set {_displayName = значение; }} @DAVID Не решение, но вы указали мне в правильном направлении, там ваша точка идет: P – msfanboy

+0

Вы сказали, что по какой-то причине, но вы не знаете, один? вы имеете в виду это серьезно как ответ? ;-) Привет, его имя свойства string display not more not 100000 LOC app. Я хочу сохранить его практичным. – msfanboy

0

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

Если вы хотите, чтобы ваши подклассы не имели доступа к вашему сеттеру, за исключением только данного подкласса, вы можете использовать модификатор внутреннего доступа только для получателя и реализовать классы, которые не должны иметь доступ к установщику в другом сборка.

0

Вы должны ввести новый абстрактный класс, который будет содержать класс WizardViewModelBase. Этот класс должен переопределить свойство используя как получить и установить аксессор, но оставит свойство абстрактно, как это:

public abstract string DisplayName 
    { 
     get; 
     set; 
    } 

Затем вы можете использовать этот класс в качестве базового класса для класса WizardTimeTableWeekViewModel и вы Виль быть в состоянии отменить оба получают и устанавливают аксессоры.

+0

ввести абстрактный класс anotehr только для свойства? приходите один ... – msfanboy

0

Я бы использовал защищенный сеттер и создал отдельную функцию для установки значения. Ведь класс не имеет того же интерфейса, что и другие, поэтому его четкое отличие от других должно помочь читаемости.

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(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^