2011-08-09 12 views
0

のラッパー・インターフェースを作成する -Javaは、私が直面しています問題は以下の通りである別のインターフェース

  1. 私はサードパーティのライブラリを使用しています、メソッドとのインタフェース、EditorActionsを、持っているエディタを言います -

    create()、edit()、delete()。

  2. 私は公開したくありません、EditorActions私の実装では。したがって、私のインターフェイスには、

    myCreate()、myEdit()、myDelete()のようなメソッドがあり、次にEditorActionsメソッドを呼び出す必要があります。

    EditorActionsはインターフェイスのみです。実装はライブラリの内部にあります。

    2つのインターフェイスをどちらも実装せずにリンクするにはどうすればよいですか?あなたはこれを行うことができますライブラリからEditorActionsのインスタンスを取得すると仮定すると、すべてのあなたの助けを

おかげ

+0

なぜインターフェイスが必要ですか?あなたは本当にあなたのラッパーインターフェースのための複数の実装を持っていますか?今日の実装が1つだけ必要な場合は、両方のインタフェースを実装するクラスを作成します。インターフェイスが後で本当に必要な場合は、それを抽象化するのは簡単ではありません。後で必要と思われるかもしれないと思うだけでインタフェースを作ってはいけません。現在の要件に合わせてビルドします。 – Paul

答えて

0

public class FooActions implements MyEditorActions, EditorActions{ 
    private EditorActions internal; 

    public FooActions(EditorActions internal){ 
     this.internal = internal; 
    } 

    @Override 
    public void create(){ 
     internal.create(); 
    } 

    @Override 
    public void myCreate(){ 
     // do stuff 
     this.create(); 
    } 
} 

これが何をするかとライブラリオブジェクトのインスタンスをラップされますあなたと同じインターフェースを実装するオブジェクトです。次に、あなたが望むどんなインターフェースでもオブジェクトを公開するだけです。私はそれらのいずれかを実装せずに2つのインターフェイスをリンクするにはどうすればよい

EditorActions a1 = new FooActions(); // a1 only shows library methods 
MyEditorActions a2 = a1; // now a2 only shows your methods 
+1

これは[委任パターン](http://en.wikipedia.org/wiki/Delegation_pattern) – Bohemian

+0

として知られていますありがとうございますジェレミー、私はあなたの返信のおかげで、これらの行に考えてきました – kelly

0

できません。ここで自動魔法をしようとしています。魔法をしないでください。何に関係なく、どちらか一方を実装する必要があります。

または、自分のリフレクション配管(または何とかしてAOP)を実装して、オンザフライでクラスを作成する必要があります。後者は単純な方法ではありません。一般的には、余計なものを実装することを避けるために過剰機械と過剰工学の赤旗があります。delegateです。

OTHでは、サードパーティのインターフェイスA(たとえばゲッターメソッドのみ)によって提供されるメソッドのサブセットを「公開」したい場合は、ほとんど古いグリースまたはリフレクションライブラリ)あなたが望むメソッドのサブセットのみを公開します。

インターフェイスDirtyThirdPartyInterface { StupidCrap getSomeStupidCrap(); void setStupidCrap(); }

インターフェイスMySanitizedInterface { StupidCrap getSomeStupidCrap(); //セッターはこのインタフェース }

言う、と続いて

、春AOPまたは類似のものまたはそこにいくつかの反射ライブラリのいずれかの一部ではない、あなたはAOPとしてMySanitizedInterfaceの実装を自動生成することができインターセプタは、サードパーティのインターフェイスのゲッターに(リフレクションを介して)ゲッターへの呼び出しを単にプロキシします。

しかし、これは単純なハンドコーディングになるのを単純に避けるために、(サードパーティライブラリの依存関係はもちろんのこと、たくさんの)うんざりです。すべての配管マラキーを正当化する現実の事例を見つけるのはまれです。そんなことに遭遇した場合、私が最初に考えるのは「赤旗」です。もちろんYMMV。

2

抽象クラスで使用するメソッドを公開することで、これを行うことができます。そして、人々にあなたが望む特定の方法を実装するように強制します。

EditorActionsインターフェイスのメソッドと、実装を強制するメソッドを使用できます。

public abstract class AbstractEditorActions { 

    private EditorActions ea; 

    public AbstractEditorActions(EditorActions ea) { 
     this.ea = ea; 
    } 

    // In this method, you can use the methods 
    // from the interface and from this abstract class. 
    // Make the method final so people don't break 
    // the implementation. 
    public final void yourExposedMethod() { 
     // code 
     this.toImplement(); 
     ea.doMethod(); 
    } 

    protected abstract toImplement(); 

} 
関連する問題