【问题标题】:Setter for a clr-property that is defined in an abstract base class with only a getter在抽象基类中定义的 clr 属性的设置器,只有一个 getter
【发布时间】:2010-06-20 18:23:36
【问题描述】:

有没有办法为在抽象基类中定义的 clr 属性声明一个 setter(反之亦然)?

abstract class BaseClass {
    public abstract string Test {
        get;
    }
}

class ConcreteClass : BaseClass{
    public override string Test {
        get { return string.Empty; }
        set { /* Some code*/} // This would be really pratically
    }
}

对于标记为虚拟的属性,可能会询问相同的问题。

【问题讨论】:

  • 你的 BaseClass 是完全抽象的。那应该是一个接口,问题解决了。
  • 在某些情况下,我不喜欢制作接口,想要更多类似上面的东西。但是是的 - 一个界面可以解决问题。

标签: c# .net


【解决方案1】:

幸运的是,这是不可能的。您不能更改现有的定义/合同。

有很多方法可以绕过它,例如 new 关键字。或者使用接口。

【讨论】:

  • new 不是解决它的方法,new 是看起来相同的不同的东西。基类 foo = getFoo();字符串 myFoo = foo.Test;和 ConcreteClass foo = (ConcreteClass)getFoo();字符串 myFoo = foo.Test;对于 same 对象 可能会产生不同的结果
  • 哪个定义/合同会被破坏?它只是派生类中的一个附加方法。但是,是的,这似乎是不可能的。非常感谢您的回答。
【解决方案2】:

有一种可能的解决方法。

在基类中声明一个受保护的setter,然后在具体类中实现它。

像这样:

abstract class Base
{
    public abstract string Test { get; protected set; }

}

class Concrete : Base
{
    string s;
    public override string Test
    {
        get { return s; }
        protected set { s = value; }
    }
}

...但很漂亮,它不是:-)

【讨论】:

  • 感谢您的回答,这个声明是可能的,但不是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2011-05-25
  • 2013-09-04
  • 1970-01-01
  • 2019-06-23
  • 2022-07-27
相关资源
最近更新 更多