是否有可能做这样的事情?

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B: A
{
    private string X;
    public override string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

也就是说,基类提供的虚拟属性仅具有GET存取,但子类覆盖GET和还提供一组。

在当前的例子不能编译,但也许我失去了一些东西。

补充:为了澄清,没有我不希望有新的重新定义。我想添加一个新的访问。我知道这是不是在基类,所以它不能被重写。 OK,让我试着解释它是如何看没有语法糖:

class A
{
    public virtual string get_prop()
    {
            return "A";
    }
}
class B: A
{
    private string X;
    public override string get_prop()
    {
        return X;
    }
    public virtual string set_prop()
    {
        X = value;
    }
}
有帮助吗?

解决方案

没有,这是不可能的。不幸的是,你甚至不能覆盖和更改访问级别(从保护的到的公共的为例),如记录上的 MSDN 。我建议你考虑略微重组代码/类,并寻找一个替代方式来完成这项任务,如与的保护的修改在派生类中使用SetProperty方法。

其他提示

没有,有没有办法做到这一点。考虑如何虚拟财产的语法糖已经被处理,即,它被转换为:

public virtual string get_prop();

没有set_Prop方法重写,并且不能覆盖不存在的方法。

您可以通过隐藏在派生类中使用new关键字基类的实现。以下应成功地进行编译:

class A
{
    public virtual string prop
    {
        get
        {
            return "A";
        }
    }
}
class B : A
{
    private string X;
    public new string prop
    {
        get
        {
            return X;
        }
        set
        {
            X = value;
        }
    }
}

引入一个新的领域之嫌的凌乱。而无论哪种方式,你必须要小心,不要打破多态性和继承(如果基类会谈私有字段?)。

关于加边重写一个新的存取器;简单的答案是“不,你不能”。当你重写,只能冲击现有的存取,因为这是在虚拟表的部件(重写的成员仍是“拥有”由基/声明类,而不是覆盖类)来定义。

一个选项(不理想),是重新申报财产,但你仍然需要一个办法谈下来的基类。所以,如果在基类访问器是protected

class A
{
    public string prop
    {
        get;
        protected set;
    }
}
class B : A
{
    public new string prop
    {
        get { return base.prop; }
        set { base.prop = value; }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top