Почему я не могу добавить установленный метод доступа к переопределенному свойству? - PullRequest
8 голосов
/ 04 августа 2009

В базовом классе у меня есть это свойство:

public virtual string Text 
{
    get { return text; }
}

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

public override string Text
{
    get { return differentText; }
    set { differentText = value; }
}

Это, однако, не работает. Я получаю красный волнистый сигнал под set, говорящий, что я не могу переопределить, потому что у него нет набора доступа Почему это проблема? Что мне делать?

Ответы [ 5 ]

5 голосов
/ 04 августа 2009

Во втором блоке кода вы создаете открытый метод set, но слово "override" в объявлении заставляет компилятор искать метод с такой же сигнатурой в базовом классе. Поскольку он не может найти этот метод, он не позволит вам создать ваш набор.

Как говорит ArsenMkrt, вы можете изменить базовое объявление, чтобы оно содержало защищенный набор. Это позволит вам переопределить его, но, поскольку вы по-прежнему не сможете изменить подпись, вы не сможете рекламировать этот метод в открытом доступе в своем подклассе, поэтому размещенный вами код все равно не будет работать.

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

///<summary>
///Get the Text value of the object
///NOTE: Setting the value is not supported by this class but may be supported by child classes
///</summary>
public virtual string Text 
{
    get { return text; }
    set { }
}

//using the class

BaseClass.Text = "Wibble";
if (BaseClass.Text == "Wibble")
{
    //Won't get here (unless the default value is "Wibble")
}

В противном случае объявите набор как отдельный метод в вашем дочернем классе:

public override string Text
{
    get { return differentText; }
}

public void SetText(string value)
{
    differentText = value;
}
5 голосов
/ 04 августа 2009
public virtual string Text 
{
    get { return text; }
    protected set {}
}

измените свойство базового класса следующим образом: вы пытаетесь переопределить метод set, который не существует

3 голосов
/ 04 августа 2009

Вы хотите, чтобы при использовании дочернего типа открывалось больше возможностей. Похоже, вы не хотите переопределять, вы хотите тень. Просто используйте новое ключевое слово, чтобы скрыть свойство Text только для чтения под свойством для чтения / записи.

В базовом классе:

protected string text;
public string Text 
{
    get { return text; }
}

В производном классе:

new public string Text 
{
    get { return text; }
    set { text = value; }
}
2 голосов
/ 04 августа 2009

Вы можете скрыть свойство от базового класса:

public new string Text
{
    get { return differentText; }
    set { differentText = value; }
}

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

2 голосов
/ 04 августа 2009

Это проблема, потому что вы нарушаете инкапсуляцию. Вы не можете переопределить что-то и сделать это более доступным, это выбросило бы все о инкапсуляции в окно.

Это правило применимо и в вашем случае, даже если вы фактически выставляете что-то, что не является исходным значением.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...