2017-02-26 5 views
0

OpenGL/GLE用のフレームワークの設計に取り組んでいます。Java継承の制限を克服する(ご意見/ご提案)

私は「テクスチャ」抽象クラスを作成しました。 Texture2DとTextureCubemapをTextureから継承しています。 Texture2DからはRenderTextureが、TextureCubemapにはRenderTextureCubemapがあります。今これはすべて正常に動作しますが、RenderTextureとRenderTextureCubemapはどちらも同じ数の類似点を共有します。私はそれらの間の現在の冗長性を削除したいと思います。他の言語では、これは多重継承のための最適な場所ですが、Javaではこれをサポートしていません。私の2番目のアイデアはインターフェースでした。ここで問題となっているのは、インターフェイスメソッドのボディを定義することができないため、実際に私に利益をもたらすものではありません。もう一つのオプションは、 "RenderTarget"クラスを作成し、これをメンバ変数として追加することです。これは動作しますが、 "RenderTarget"クラスで保持されているものにアクセスするたびにメンバ変数にジャンプする必要はありません"、それは一種のように思われる。

誰かがより洗練された解決策を提案できるかどうかは疑問です。

編集:これは、リクエストごとの図です。 enter image description here

+0

クラス図の形式のスクリーンショットを追加できますか?説明はうまくいきますが、画像はより良いでしょう。 –

+1

Java 8以降、インターフェースには、本体がある 'default'メソッドを持つことができます。 –

+2

@ JornVernee私はこれが 'default'の正しいユースケースではないと思っています。 – ajb

答えて

0

実際にJava 8以降では、インターフェイスにメソッド本体を定義できます。https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.htmlを参照してください。これは解決策になる可能性があります。

コメントに示唆されているように、冗長コードを別のクラスに配置し、両方のレンダラーに組み込むことができます(つまり、このコードを持つメンバ変数を作成する)。

ここに当てはまる場合は、冗長性をヘルパークラス(インスタンス化不可能なメソッドと静的メソッドのみ)に因数分解し、その静的メソッドを2つのレンダラーからポーリングすることもできます。

+0

これは本当であり、うまくいくはずですが、私はAndroid用に構築しています。悲しいことに、インターフェイスのデフォルトメソッドはAPI 24のみでサポートされています。このコードを下位互換性にすることを目指していますオプションアウト。しかし、私は同意する、一般的なJavaの答えを探している人は誰もがこの敗走をする必要があります。 –

+0

あなたのコードがどのように見えるのか分からないのは確かに役に立ちませんが、 "RendererTarget"変数の追加を避けたい場合は、ヘルパクラス内の冗長性を考慮してください(静的メソッドでは、完全なオブジェクトを運ぶ)。今では、複数の継承を避けるために、Javaでは常に優遇されています。たとえば、この欠如は、あなたがダイヤモンドの問題を気にする必要がないことを保証します。 – Adonis

+0

注意してください。デフォルトのメソッドは、実装ではなくオーケストレーションを表現するためのものです。抽象クラスの具体的なメソッドと同じように扱うのは誤りです。 –

関連する問題