是否可以通过覆盖.NET中的属性添加访问器?

时间:2009-02-13 11:03:38

标签: .net properties polymorphism override accessor

是否可以做这样的事情?

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并提供一个SET。

目前的例子没有编译,但也许我在这里遗漏了一些东西。

已添加:要澄清,不,我不想重新定义新内容。我想添加一个新的访问者。我知道它不在基类中,因此无法覆盖。好吧,让我试着解释一下如果没有语法糖,它会是什么样子:

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

4 个答案:

答案 0 :(得分:1)

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

public virtual string get_prop();

没有要覆盖的set_Prop方法,也不能覆盖不存在的方法。

答案 1 :(得分:1)

不,这是不可能的。遗憾的是,您甚至无法覆盖和更改访问者级别(例如,从受保护的 public ),如MSDN所述。我建议您考虑稍微重构代码/类,并寻找另一种方法来完成此任务,例如使用派生类中的SetProperty方法使用 protected 修饰符声明set访问器。

答案 2 :(得分:0)

您可以在派生类中使用“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;
        }
    }
}

答案 3 :(得分:0)

介绍一个混乱的新领域。无论哪种方式,你都需要注意不要破坏多态和继承(如果基类与私有字段对话会怎么样?)。

关于在覆盖时添加新的访问者;简单的答案是“不,你不能”。当您覆盖时,您只能影响现有的访问者,因为这是在成员的虚拟表中定义的内容(被覆盖的成员仍然由基础/声明类“拥有”,而不是覆盖的类)。 p>

一个选项(不理想)是重新声明属性,但是你仍然需要一种方法来讨论基类。因此,如果基类中的访问者是protected

class A
{
    public string prop
    {
        get;
        protected set;
    }
}
class B : A
{
    public new string prop
    {
        get { return base.prop; }
        set { base.prop = value; }
    }
}