あなたはここにいくつかのオプションがあり、一部はすでに言及されています。あなたはすでにMasterObject
にインターフェイスを追加することはできませんし、相互作用はちょうどdoSomething
よりも複雑であると述べました。他のどのような制約も、あなたに最適なものを決定する可能性があります。
最初の選択肢は、クレイグが提案するようにして、MasterObject
を拡張してMyInterface
を実装するために中間AbstractMasterObject
を作成することです。これは、MasterObject
とMyInterface
の両方のインスタンスを持つ単一の参照をすばやく簡単に作成できます。欠点は、Main
がMasterObject
の代わりにAbstractMasterObject
を使用しなければならないことです。だから、MasterObject
という他のサブクラスは使用できません。それはまったく問題ではないかもしれませんし、完全な契約者かもしれません。現実的には、それは間にある。
もう1つの選択肢は、継承の代わりに合成を使用することです。したがって、ObjectA
とObjectB
はそれぞれ、拡張する代わりにMasterObject
のインスタンスを持ちます。そして、彼らは(簡潔にするために、私はちょうどObjectA
を示しています)MasterClass
行動へのアクセスのためにその参照を使用します。ここから
class ObjectA implements MyInterface {
private masterObject masterObject;
public ObjectA(MasterObject masterObject){
this.masterObject = masterObject;
}
@Override
public void doSomething(){ /* Implementation */ }
}
、Main
にこれを組み込むために、いくつかの異なる戦略があります。 MasterClass
への参照がMain
にあり、それをObjectA
コンストラクタに渡すことができます。その後、両方のMasterClass
とMyInterface
参照を維持:ObjectA
はMasterObject
メソッドをオーバーライドすることも、いずれprotectedメンバにアクセスし、どちらも場合
このアプローチは動作します。また、Main
とObjectA
の両方に同じMasterObject
への参照を持つ混乱につながる可能性があります。両方のクラスがMasterObject
の状態を変更することができれば、ややこしいバグに終わるかもしれません。一方、これらのどれもが心配しない場合、これは良い方法かもしれません。 MasterObject
を中断することなくMyInterface
をMain
に追加し、MasterObject
を間接的に使用してMyInterface
を実装します。
またはMasterObject
を完全にMain
から非表示にして、MyInterface
を介してのみやりとりすることができます。これを行うには、単にgetMasterObject
〜MyInterface
にすることができます。または、具体的にはMain
とのやりとりに関するメソッドをMyInterface
に追加することもできます。このようなアプローチは最もクリーンだと思いますが、ほとんどのコードを変更する必要があります。これが主に新しい開発であれば、それはリファクタリングの努力に値するかもしれません。それが古いコードであれば、私はあまり侵略的ではない方法を好むでしょう。
もう1つの選択肢は、少し異なる方向からアプローチします。クラスは、定義したとおりに使用します。差がMain
が同じインスタンスを指し両方MasterObject
とMyInterface
基準を有することである。
class Main {
private MasterObject masterObject;
private MyInterface myInterface;
public void method1(){
ObjectA objectA = new ObjectA();
masterObject = objectA; // Legal because ObjectA extends MasterObject
myInterface = objectA; // Legal because ObjectA implements MyInterface
myInterface.doSomething(); // This does ObjectA's implementation
masterObject.someMasterObjectMethod();
}
}
Main
するように、同じインスタンスがMyInterface
とMasterObject
として実行することを完全に偶然です。私は、これが最も侵襲的でないため、これがレガシーコードであれば、このアプローチが最も良いと思います。これが比較的新しいコードなら、私はこのようなものに頼る前に他の戦略を検討したいと思います。まだ他のアプローチがありますが、これは良い概観であるべきだと思います。何があっても、元に戻って、それぞれのクラス間の関係が本当に何であるかを考えなければなりません。それはあなたを正しい方向に向けるのに役立ちます。
'MasterObject'クラスを変更できますか? – CraigR8806
@ CraigR8806いいえ、私はそうではありません。 –