0

次のクラス階層があります。

public abstract class BaseClass : IBaseInterface
{

    public int PropertyA{
        get
        {
            return this.propertyA;
        }

        set
        {
            this.propertyA = value;
            // ... some additional processing ...
        }
    }
}

DerivedClassB : BaseClass
{
    // some other fields
}

public class ContainingClassC
{
    public IBaseInterface BaseInterfaceObjectD
    {
        get;
        set;
    }
}

ここで、(BaseClass から継承された) DerivedClassB-Object の PropertyA にアクセスするには、次のように、オブジェクトを BaseClassA の祖先にキャストする必要があります。

// This ContainingClassC is returned from a static, enum-like class:
// containingObject.PropertyA is DerivedClassB by default.
ContainingClassC containingObject = new ContainingClassC();

((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42;

これらのクラスを再構築してキャストをなくす方法はありますか? このコードはライブラリの一部であり、同僚はキャストを削除するように求めています。

目標は単純に書くことcontainingObject.BaseInterfaceObjectD.PropertyA = 42です。

4

1 に答える 1

0

まず((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42;、メンバーを宣言されているのと同じタイプにキャストする行で、キャストは実際には何もしません。

派生クラスで PropertyA にアクセスできるようにするには (インターフェイスにキャストしているため)、プロパティをインターフェイスで宣言してから、BaseClass で実装する必要があります。

public interface IBaseInterface{
  int PropertyA{get;set;}
}

public abstract class BaseClass : IBaseInterface{
  public int PropertyA{
    get{ return this.propertyA;}
    set {this.propertyA = value;}
   }
}

インターフェイスが適切に実装されている限り、ProprtyA は基本クラス、派生クラス、またはインターフェイス型にキャストされたそれらのいずれかで使用できる必要があります。

プロパティが IntelliSense に表示されないだけの問題である場合は、設定に問題がある可能性があります。[オプション] -> [テキスト エディター] -> [C#] を調べて、IntelliSense がオンになっていて、何も非表示に設定されていないことを確認してください。

于 2012-07-09T10:33:07.873 に答える