あなたはそれが明示的に実装していないインターフェイスにオブジェクトをキャストすることはできますか?

stevendesu:

私は、具体的実装に興味があるStrategyパターンの戦略の1つ(またはそれ以上)は、サードパーティのライブラリから来ます。

私はそうのようなクラスを使用して、サードパーティのライブラリを持っています:

public class LibraryClass {
    public void doSomething() {
        // ...
    }
}

私はその後、同じインターフェイスで自分のクラスを作成しました:

public class MyClass {
    public void doSomething() {
        // ...
    }
}

今、私のコードでは、私は次のことをやりたいです。

public class MainActivity extends AppCompatActivity {
    public interface Strategy {
        void doSomething();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Strategy oneClass = (Strategy)(new MyClass());
        Strategy twoClass = (Strategy)(new LibraryClass());
        oneClass.doSomething();
        twoClass.doSomething();
    }
}

この場合、この方法は、インタフェースがあるので、存在している技術的に有効で、それが明示的に実装されていませんでした。私はこれをやってみました場合は、実行時エラーを投げました:

java.lang.ClassCastException: MyClass cannot be cast to MainActivity$Controls

最悪のシナリオは、私が使用することができます知っているプロキシパターンをラップするためにLibraryClass何かでない実装Strategyのインターフェイスを:

public class LibraryClassProxy implements Strategy {
    private LibraryClass internal;
    public void LibraryClassProxy() {
        internal = new LibraryClass();
    }
    public void doSomething() {
        internal.doSomething();
    }
}

クラスIは、実装に拡張していますので、特に-しかし、私は、可能な場合は、これを避けるために好む他のインタフェースの多くを、私はむしろ、プロキシにすべての単一のパブリックメソッドを持っていないと思います。

SDJ:

他の人が指摘したように、Javaでのインターフェース定義が明示的な宣言に基づいています。私はあなたが記述している状況がで覆われていると考えているアダプタのデザインパターンではなく、プロキシ:

意図:顧客が期待する別のインターフェイスへのクラスのインタフェースを変換します。アダプタは、クラスが一緒に作業することができますその可能性はないそうでないため、互換性のないインタフェースの。---のGoFのp。139

そして、「プロキシ」ソリューションあなたはに対応を指摘するオブジェクトアダプタパターンの変種。場合はLibraryClass最終的にはありませんが、考慮すべき1つのオプションは使用することですクラスのパターンのバリエーションを:

class MyLibraryClass extends LibraryClass implements Strategy {
   /* ... */
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312289&siteId=1