2008-10-20 5 views
10

Если у меня есть свойство, которое я хочу, чтобы наследователи пишут, но сохраняйте readonly извне, какой предпочтительный способ реализовать это? Обычно я пишу примерно так:Каков наилучший способ реализации свойства, которое доступно только для публики, но доступно для записи наследникам?

private object m_myProp; 
public object MyProp 
{ 
    get { return m_myProp; } 
} 
protected void SetMyProp(object value) 
{ 
    m_myProp = value; 
} 

Есть ли лучший способ?

ответ

36
private object m_myProp; 
public object MyProp 
{ 
    get { return m_myProp; } 
    protected set { m_myProp = value; } 
} 

Или в C# 3,0

public object MyProp {get; protected set;} 
+0

Поле `protected` окажется превосходным, если в нем когда-либо понадобится использовать какие-либо` Interlocked` методы. Мне показалось странным, что C# предоставляет делегаты событий с тем же именем, что и события, но не раскрывает переменные поддержки авто-свойства вообще. – supercat 2012-10-10 18:27:13

0

Имея сеттер и геттер на самом деле не лучше, чем иметь переменную на этом уровне видимости.

Поэтому вы можете просто защитить переменную и публиковать читателя.

Это говорит о том, что сеттеры и геттеры являются индикатором плохого ОО - вы уверены, что нуждаетесь в них? Вы должны попросить объект что-то сделать со своими членами, не прося его для своих членов, а затем манипулировать ими вне объекта.

Это очень общее правило, и есть много исключений.

+2

Глупости; геттер/сеттер * значительно лучше, чем защищенное поле. Getters/seters - это * не * показатель плохого OO: они показывают инкапсуляцию и позволяют полиморфизм (через виртуальный) - как OO вы хотите? – 2008-10-20 21:13:04

+0

Они по-прежнему демонстрируют реализацию вашего класса и являются признаком того, что вы получаете данные вместо того, чтобы просить класс выполнить операцию для вас. Это не OO, это фальшивка, которую используют процедурные программисты, прежде чем они действительно получат OO. – 2008-10-20 23:10:06

5

Это, безусловно, путь.

public object MyProp {get; protected set;} 

Если вы используете более старую версию C#, то это путь.

private object _myProp; 
public object MyProp 
{ 
    get { return _myProp; } 
    protected set { _myProp = value; } 
} 

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

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