在c#中覆盖并添加新的类成员

时间:2014-01-28 11:30:29

标签: c# override

如何做这样的事情(不创建中间类):

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; }
    }
}

3 个答案:

答案 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; }
}