1

我遇到了字段继承的问题。首先,我将解释我希望它如何工作,然后就如何更改语法来做我想做的事情征求建议。

这是我尝试过的:

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;” 到 A1 的 D1 并在我尝试在 C 中使用它时抛出 NotImplementedException ,但这会阻止问题出现在编译器中。有人知道解决这个问题的方法吗?我真的很想将它们保留为字段,以便我可以使用 WPF 显示它们。

4

2 回答 2

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.
}
于 2012-09-27T17:12:29.077 回答
1

您的错误在于 class B。在类中A,您定义D1public abstract D D1 { get; } 但是,在B您尝试覆盖D1并添加一个 setter 时,该 setter 不是由抽象类定义的。您需要找到另一种方法来设置B. 如果其他类需要能够设置,D1那么您可能需要定义D1public abstract D D1 { get; set; }

如果B只需要能够设置值,直接设置成员值即可。

于 2012-09-27T17:08:23.637 回答