在您的第二个代码块中,您正在创建一个公共 set 方法,但声明中的“覆盖”一词使编译器在基类中寻找具有相同签名的方法。由于它找不到该方法,因此不允许您创建集合。
正如 ArsenMkrt 所说,您可以更改基本声明以包含受保护的集。这将允许您覆盖它,但由于您仍然无法更改签名,因此您无法将此方法提升为子类中的公共,因此您发布的代码仍然无法正常工作。
相反,您需要向您的基类添加一个不执行任何操作的公共虚拟 set 方法(或者如果您尝试调用它甚至会引发异常),但这与该类的用户期望的行为背道而驰所以如果你这样做(我不会推荐它)确保它有很好的文档记录,用户不会错过它:
///<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;
}