Каков наилучший способ реализации свойства, которое доступно только для публики, но доступно для записи наследникам?

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

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

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

Ответ 1

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

Или в С# 3.0

public object MyProp {get; protected set;}

Ответ 2

Это определенно путь.

public object MyProp {get; protected set;}

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

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

Ответ 3

Наличие сеттера и получателя на самом деле не лучше, чем наличие переменной на этом уровне видимости.

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

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

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