Во втором блоке кода вы создаете открытый метод 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;
}