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();
        }
    }
}

問題は、D1のセットでオーバーライドするメソッドが見つからないため、Aがコンパイルされないことです。これは私がそれが機能することを期待した方法です:

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**

私が見ることができる1つの解決策は、「セット」を追加することです。A1のD1に移動し、Cで使用しようとすると、NotImplementedExceptionをスローしますが、これにより、問題がコンパイラに表示されなくなります。この問題を回避する方法を知っている人はいますか?WPFを使用して表示できるように、フィールドとして保持したいと思います。

4

2 に答える 2

2

セッターを使用してプロパティを拡張しても、クラスの継承では機能しません。ただし、インターフェイスの実装では機能します

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

エラーはクラスにありBます。クラスでは、次のAように定義D1します。public abstract D D1 { get; } ただし、抽象クラスでは定義されていないセッターBをオーバーライドD1して追加しようとしています。で値を設定する別の方法を見つける必要がありますB。他のクラスを設定できるようにする必要がある場合は、次のD1ように定義することをお勧めしD1ますpublic abstract D D1 { get; set; }

B値を設定するだけでよい場合は、メンバーの値を直接設定してください。

于 2012-09-27T17:08:23.637 に答える