2012-02-26 8 views
1

私はラッパーを書くために、BaseとDerivedの2つのクラスを持っています。 Derivedには、Baseに存在しない追加の機能が含まれています。これらのクラスは私のコントロール外にあり、変更することはできません。ベースクラスと派生クラスの両方のラッパー(アダプタ)を作成するにはどうすればよいですか?

問題は次のとおりです。どのようにしてa)キャストするかb)重大なコードの重複がなくとも両方のクラスをラップできますか?

ここで鋳造してソリューションです:

class BaseWrapper { 
    Base b; 
    someFunction() { 
     b.someFunction(); 
    } 
} 

class DerivedWrapper : BaseWrapper { 
    someOtherFunction() { 
     ((Derived) b).someOtherFunction(); 
    } 
} 

はここで重複して一つだ:

class BaseWrapper { 
    Base b; 
    someFunction() { 
     b.someFunction(); 
    } 
} 

class DerivedWrapper { 
    Derived d; 
    someFunction() { 
     d.someFunction(); 
    } 
    someOtherFunction() { 
     d.someOtherFunction(); 
    } 
} 

私は2番目に最初のソリューションを好む、しかし確実にもっと良いものがなければならない...

答えて

0

(注:このコードはC#またはC#のような擬似コードと仮定します)

プレット私が考えることができるのは、BaseWrapperをサブクラス化し、実際の型(派生)としてオブジェクトへの追加参照を保持し、bを(Base) dに設定することだけです。あなたは、コンストラクタに包まれたオブジェクトを渡していると仮定すると、私はこのようにそれを設定したい:あなたはまだBase bを持っているので

class BaseWrapper { 
    Base b; 
    someFunction() { 
     b.someFunction(); 
    } 
} 

class DerivedWrapper : BaseWrapper { 
    Derived d; 

    DerivedWrapper(Derived d) { 
     this.d = d; 
     this.b = (Base) d; 
    } 

    someOtherFunction() { 
     d.someOtherFunction(); 
    } 
} 

someFunctionは、スーパークラスから作業を続けています。まだ1つのキャストがありますが、それはコンストラクタにあり、すべてのメソッドで指定する必要はありません。

(注意:あなたもコンストラクタでキャストは必要ありませんが、それはあなたの他の参照が同じタイプではないことを素敵なリマインダーです。)

+0

私はあなたの答えが好きで、私は多少イライラだ私はすぐにそれを考えなかった。私はそこに良い方法があるとは思わない。あなたはコンストラクタにキャストする必要はありません。 – iansimon

+0

それは本当です。それでも暗黙のキャストよりも明示的なキャストが好きです。私は私の答えでそれをメモします。 – chroipahtz

関連する問題