如何做这样的事情(不创建中间类):
abstract class A
{
public abstract string Text { get; }
}
class B : A
{
string text = "";
public override string Text
{
get { return text; }
}
new public string Text
{
get { return (this as A).Text; }
set { text = value; }
}
}
编译器说:类型'B'已经包含'Text'的定义。
澄清:怎么做(但没有“中级”课程):
abstract class A
{
public abstract string Text { get; }
}
class Intermediate : A
{
protected string text = "";
public override string Text
{
get { return text; }
}
}
class B : Intermediate
{
new public string Text
{
get { return (this as A).Text; }
set { text = value; }
}
}
答案 0 :(得分:4)
如果您希望在派生类中对该属性进行读写,那么这是不可能的
该属性是PropertyType get_PropertyName()
(当属性可读时)和void set_PropertyName(PropertyType value)
(当属性可写时)方法的语法糖。这一行:
public abstract string Text { get; }
表示:
public abstract string get_Text();
而且:
public override string Text{ get; set;}
表示:
public override string get_Text()
{
// ...
}
public override void set_Text(string value)
{
// ...
}
由于基类中没有抽象set_Text
方法,因此无法覆盖它。
答案 1 :(得分:1)
您在同一个类中定义属性Text两次。您正在覆盖它并使用关键字new。删除文本的第二个副本。
class B : A
{
private string text;
public override string Text{ get; set;}
}
答案 2 :(得分:0)
您可以使用界面执行此操作:
interface A
{
// The interface requires that Text is *at least* read only
string Text { get; }
}
class B : A
{
string text = "";
// Implement Text as read-write
public string Text
{
get { return text; }
set { text = value; }
}
}
如果这对您不起作用,您只需添加一个可读写的TextEx
属性:
public string TextEx
{
get { return text; }
set { text = value;
}
public string Text
{
get { return text; }
}