2017-10-19 4 views
0

悪質なタイトルで申し訳ありませんが、この問題の正確な内容を絞り込むのは難しいです。別のベースクラスでベースクラス型変数への呼び出しを自動的にキャスト

私は本質的に並列に構築される2つのクラス階層を持っています:BaseObjectのすべてのサブタイプに対して、BaseUIObjectのサブタイプがあります。これの具体的な理由は、BaseObjectsが実際にスクリプト可能オブジェクト(単一性)であるため、これらのスクリプト可能オブジェクトの1つのインスタンスを表す別のクラスセットを使用しているためです。

例コードは:

public abstract class BaseUIObject { 
     public BaseObject someObject; 

     public void Setup(BaseObject baseObject) 
     { this.baseObject = baseObject; } 
    } 

    public class SomeUIObject : BaseUIObject { 
     public void Setup(SomeObject someObject) 
     { base.Setup(someObject); SomeUIObjectSpecificRoutine(); } 

     private void SomeObjectSpecificRoutine() { 
      someObject.doSubClassFunction(); 
     } 
    } 

SomeUIObjectのセットアップに型SomeObjectののオブジェクトを渡し、それが代わりSomeObjectののBaseObjectとして格納されてしまいます。この事態を防ぐきれいな方法はありますか?

私が持っている2つのオプションは、SomeUIObjectのメソッドで使用するたびに、SomeObject変数をBaseUIObjectのすべてのサブクラスで定義するか、(SomeObject)someObjectを明示的にキャストすることです。これらのメソッドのどちらもきれいに見えないし、これを行うために継承を使用するいくつかのより良い方法がなければならないように感じる。

ありがとうございました。

答えて

1

私にジェネリック医薬品のための良い場所のように思える:

public abstract class BaseUIObject<T> where T : BaseObject 
{ 
    public T theObject { get; private set; } 

    public virtual void Setup(T baseObject) 
    { 
     this.theObject = baseObject; 
    } 
} 

そして、あなたの具体的なUIオブジェクトに:

public class SomeUIObject : BaseUIObject<SomeObject> 
{ 
    public override void Setup(SomeObject someObject) 
    { 
     base.Setup(someObject); 
     SomeUIObjectSpecificRoutine(); 
    } 
    // rest of concrete class code... 
} 
+0

パーフェクト - これは私が後だまさにですが、知識を欠いていました適切にGoogleにできるようにする。クイック返信をありがとう、これが動作するかどうかを確認します。 – Cerzi

+0

SomeUIObject-type/namespaceのSetup()arg型にT型の問題があります。 私はおそらくその実際の定義があるのでBaseUIObject自体は、別のクラスから継承することに注意してください: パブリック抽象クラスBaseUIObject :BaseObject – Cerzi

+0

タイプTあなたが相続の宣言に使用するタイプである:TはOtherBaseClass。あなたのコードはどのようになっていますか? –

関連する問題