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

StackOverflow https://stackoverflow.com/questions/1227205

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Как говорит 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;
}

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top