与get属性的接口,带get的抽象类,带get和set的子类

时间:2015-06-18 09:21:55

标签: c# inheritance

我试图建立一个声明属性必须有get:

的接口
public interface IValue {
    public int Value { get; }
}

然后有一个抽象类也定义它,但保持抽象:

public abstract class BaseClass : IValue {
    public abstract int Value { get; }
}

然后我想允许子类定义getter并添加一个setter:

public class SubClass : BaseClass {
    public int Value { get; set; }
}

我收到如下错误:

'SubClass.Value' hides inherited member `BaseClass.Value'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword

如果我尝试:

public class SubClass : BaseClass {
    public override int Value { get; set; }
}

我明白了:

`SubClass.Value.set': cannot override because `BaseClass.Value' does not have an overridable set accessor

当从仅定义getter的抽象类继承时,是否有任何方法允许子类可选地添加setter?

更新:为了澄清,我知道我可以做的解决方法。我的目标是看看我能做到这一点最干净的方式。我之所以不在BaseClass上抛出一个公共setter是因为BaseClass的某些子类可能没有公共setter。最终目标基本上只是为他们常用的时间提供一个共同的价值吸气剂。

3 个答案:

答案 0 :(得分:1)

  1. 'SubClass.Value'隐藏了继承的成员“BaseClass.Value”。要使当前成员覆盖该实现,请添加override关键字。否则,请添加new关键字
  2. 警告不是错误。它只是说你在抽象和具体类中都有public int Value。您的抽象类具有此属性的实现,因此当您在具体类中再次声明它时,只需将其替换为新属性即可。因此,编译器建议您为此目的使用“new”字。

    1. 要使用public override int Value { get; set; },您必须在基类中标记为“virtual”。只能覆盖虚拟成员。

      A类{public virtual int Value {get;组; }} B类:A {public override int Value {get;组; }

    2. P.S。默认情况下,接口成员是公共和抽象的。因此,如果在接口中声明getter和setter,则必须在具体类中实现它。

      尝试使用此代码:

      public interface IValue
      {
          int Value { get; set; }
      }
      
      public abstract class BaseClass
      {
          int value;
          int Value { get { return value; } }
      }
      
      public class SubClass : BaseClass, IValue
      {
          public int Value { get { return Value; } set { this.Value = value; } }
      }
      

答案 1 :(得分:1)

您无法覆盖getter,并添加新的setter。 当属性编译为get_Valueset_Value方法时,这就是您的代码:

public interface IValue
{
    int get_Value();
}

public abstract class BaseClass : IValue
{
    public abstract int get_Value();
}

public class SubClass : BaseClass
{
    public override int get_Value() { /* ... */ }

    // there's no set_Value method to override in base class
    public override void set_Value(int value) { /* ... */ }
}

至少有三种方式:

  • new int Value中定义SubClass属性(注意,然后有difference};
  • 覆盖Value属性,并在SetValue;
  • 中添加SubClass方法
  • BaseClass中定义setter并覆盖属性。

答案 2 :(得分:0)

似乎没有办法在中间添加一个抽象类的集合,而不预先声明一个setter。我尝试了很多不同的组合,没有运气。

最后,我最终做到了这一点,这并不理想,但至少让我无处可见。

public interface IValue {
    public int Value { get; }
}

public abstract class BaseClass : IValue {
    public abstract int Value { get; }
}

public class SubClass : BaseClass {
    protected int val;
    public int Value { get { return val; } }
    public int SetValue (int value) { val = value; }
}

public class SubClassWithoutSetter : BaseClass {
    public int Value { get { return 50; } }
}

基本上,只做一个经典的" setter,因为似乎不支持让我在事后添加setter属性的语法。

如果C#实现类似的东西,那就太好了。

public int Value { override get; set; } // note: this does not work