我遇到了字段继承问题。首先,我将解释我希望它如何工作,然后询问有关如何更改语法以执行我想要的建议。
这是我试过的:
public abstract class A
{
public abstract D D1
{
get;
}
protected D _d2;
public virtual D D2
{
get { return _d2; }
set { _d2 = value; }
}
}
public abstract class B : A
{
protected D _d1;
public override D D1
{
get { return _d1; }
set
{
_d1 = value;
Update();
}
}
}
public abstract class C : A
{
public override D D1
{
get
{
return _d2.Find1();
}
}
public override D D2
{
get { return base.D2; }
set
{
base.D2 = value;
Update();
}
}
}
问题是A不能编译,因为它找不到用D1设置覆盖的方法。这就是我期望它的工作方式:
A ab = new B();
print(ab.D1);
ab.D1 = 4; // I would expect a compiler error
((B)ab).D1 = 4; // I would expect a compiler error
A ac = new C();
print(ac.D1);
ac.D1 = 4; // I would expect a compiler error
((C)ac).D1 = 4; // **I would expect this to work**
我能看到的一个解决方案是添加“set;”如果我尝试在C中使用它,则向A1的D1抛出NotImplementedException,但这样可以防止问题出现在编译器中。有人知道解决这个问题的方法吗?我真的希望将它们保留为字段,以便我可以使用WPF显示它们。
答案 0 :(得分:2)
使用setter扩展属性不适用于类继承;但是,它适用于接口实现
public interface I
{
int Prop { get; }
}
public abstract class A : I
{
public abstract int Prop { get; protected set; }
public abstract int Prop2 { get; }
}
public class B : A
{
public override int Prop
{
get;
set; // ERROR: Cannot change accesibility here.
}
public override Prop2 { get; set; } // ERROR: Cannot add setter here.
}
public class C : I
{
public int Prop { get; set; } // OK: Adding a setter works here.
}
答案 1 :(得分:1)
您的错误与班级B
有关。在课程A
中,您将D1
定义为public abstract D D1 { get; }
但是在B
中您试图覆盖D1
并添加一个setter - 它不是由摘要定义的类。您需要找到另一种方法来设置B
中的值。如果其他类需要设置D1
,那么您可能希望将D1
定义为public abstract D D1 { get; set; }
如果B
只需要设置值,只需直接设置成员值即可。