2016-06-14 11 views
0

現在、いくつかのコードリファクタリングを行っています。だから私は既存のinheritanceデザインをdecoratorデザインに置き換えました。しかし、私は複数のジェネリック医薬品に苦しんでいます(多分それは不可能かもしれません)。複数のジェネリックのデコレータパターン

Decorator implementation

私は、現時点では上記のデザインを持っています。実装された制約に対するクラスはIConstraintです。これらの制約の具体的な実現は、SimpleConstraintASimpleConstraintBであり、どちらもClassAの値をチェックしています。 Decoratorは制約を強化する。指定された値が範囲内にないときにチェックすべきではないいくつかの制約があります。 ClassAは、DecoratorADecoratorBが対応できるように、インターフェイスIAIBを実装しています。以下のように

デザインの使い方は次のとおりです。

Test classToCheck = new Test("test"); 
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint())); 
boolean value = constraint.check(classToCheck); 

それでは、私が欲しいのは、入力パラメータと異なる種類の異なる数のコードを使用することです。同様:

Test classToCheckA = new Test("testA"); 
Test classToCheckB = new Test("testB"); 

IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint())); 
boolean value = constraint.check(classToCheckA, classToCheckB); 

または:

Test classToCheckA = new Test("testA"); 
// TestB does implement the same interfaces as Test 
TestB classToCheckB = new TestB("testB"); 

IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint())); 
boolean value = constraint.check(classToCheckA, classToCheckB); 

または:

Test classToCheckA = new Test("testA"); 
// TestB does implement the same interfaces as Test 
TestB classToCheckB = new TestB("testB"); 
// TestC does implement the same interfaces as Test 
TestC classToCheckC = new TestC("testC"); 

IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint())); 
boolean value = constraint.check(classToCheckA, classToCheckB, classToCheckC); 

私はvarargsListsまたはその代わりcheck(obj:T)からTObject[]を使用してみましたが、その後、私は常にキャストを必要とし、多くの例外処理(例えば、入力パラメータの数が正しいことが必要です)に満足できませんでした。

次のコードは私が試した一例です。 SimpleConstraintに表示されているように、checkメソッドはタイプ(Test)のみが許可されています。

public interface IConstraint<T extends ICheckable> { 
    public boolean check(T[] checkable); 
} 

public class SimpleConstraint implements IConstraint<Test> { 
    @Override 
    public boolean check(Test[] checkable) { 
     return true; 
    } 
} 

これは、上記のコードでは不可能である:入力パラメータと異なる種類の異なる数をサポートできるように

Test classToCheckA = new Test("testA"); 
// TestB does implement the same interfaces as Test 
TestB classToCheckB = new TestB("testB"); 
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint())); 
boolean value = constraint.check(classToCheckA, classToCheckB); 

デザインのいくつかの改善がありますか?上記のコードで

+0

を持っているだろう、あなたは上でより詳しく説明し、「しかし、私はいつものキャストと例外処理の多くを必要とする」ことはできますか?私は知っている、それは多くの時間が問題になるだろうが、コードを提供する必要があります - 誰かが試してみたい場合、彼/彼女は自分自身を作成する必要はありません... – Betlista

+0

@Betlista私は完全に実装されていません'varargs'、' Lists'、 'Object []'を使って解決するので、コードは実行できません。 –

+0

@Betlistaいくつかのサンプルコードを追加しました。 –

答えて

2

、問題は、そのテストで、TESTBが共通の祖先を持っていないTestB extends Testまたは他の方法で回避場合...

IConstraint<Test> constraint = ... 
boolean value = constraint.check(classToCheckA, classToCheckB); 

あなたはその仕事をすることができます。

より良いアプローチは

IConstraint<ICheckable> constraint = 
+0

はい、私は' constraint'自体でキャストする必要があります。 –

+1

申し訳ありませんが、私は間違った "ベースコード"、更新はありませんでした。 – Betlista

関連する問題