我试图建立一个声明属性必须有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。最终目标基本上只是为他们常用的时间提供一个共同的价值吸气剂。
答案 0 :(得分:1)
SubClass.Value
'隐藏了继承的成员“BaseClass.Value
”。要使当前成员覆盖该实现,请添加override
关键字。否则,请添加new
关键字警告不是错误。它只是说你在抽象和具体类中都有public int Value
。您的抽象类具有此属性的实现,因此当您在具体类中再次声明它时,只需将其替换为新属性即可。因此,编译器建议您为此目的使用“new
”字。
要使用public override int Value { get; set; }
,您必须在基类中标记为“virtual
”。只能覆盖虚拟成员。
A类{public virtual int Value {get;组; }} B类:A {public override int Value {get;组; }
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_Value
和set_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