どのように私は有界型パラメータを持つメソッドが1つのサブクラスを除外することができますか?

K男:

私たちは、テナガザル、オランウータン、ゴリラ、チンパンジーと人間はすべての類人猿であると仮定しましょう。私はそれに応じて、この関係をモデル化しました。

class Ape {}
class Gibbon extends Ape {}
class Orangutan extends Ape {}
class Gorilla extends Ape {}
class Chimpanzee extends Ape {}
class Human extends Ape {}

私は今、狩猟類人猿のための有界型パラメータで狩り()メソッドを書きたいです。

public static <T extends Ape> void hunt(T type) {}

私たちは、彼らはただの動物であるため、非ヒト類人猿を狩猟して何も間違っていると仮定しよう。それは殺人であるため、しかし、人間の狩猟することは間違っています。どのように私は法的なパラメータとして人間を排除するために上記の有界型パラメータを再書き込みすることができますか?私はここで例外では興味がありません。私は人間のパラメータで呼び出された場合狩り()メソッドがすべてでコンパイルする必要はありません。

トニー_008:

あなたがそこに予定の特定のサブクラスの方法を除外することはできません。あなたはしかし、何ができるか、あなたが狩りをしたい必要な動物が実装されたインタフェース「isHuntable」を作成し、あなたのメソッドの型の代わりに、ジェネリック型としてバインドすることを使用します。もう多分あまりエレガントな解決策は、それから延びるすべての動物を持つ、類人猿から延びる例えば「サル」と呼ばれる階層内の別のレベルを作成することで、あなたはあなたの方法のためにその猿型を使用します。でも、私は最初のアプローチで行くと思います。それは型システムにこれらのチェックを活用した方が良いですので、あなたは明示的な型チェックを使用することができますが、あなたはあなたのコード内で「オープン・クローズ」の原則を破ることと思います。

ただ、悲しいことに利用されていないされた強力なツールであるインターフェイスの動作契約の概念上のビットを拡張します。あなたはあなたの猿の中で持っていることはしっかりカップルあなたの科目「である-」の関係です。一方、「Huntable」で、その階層の構造の固有のか決定的な特徴ではなく、より多くの追加条件/動作です/あなたがその階層のサブセットに追加したいご確認ください。それは、より良いあなたがその振る舞いを持っているつもりサブセットへの契約(インタフェースの実装)を添加することによって達成されます。それは、最小限のリファクタリング、最大のセマンティック分かりやすく、より少ないバグで、しっかりと行動への種類の境界をせずに、将来の更なる契約(インタフェースの実装)を追加することができます。要するに、あなたは、リスコフの置換原則、またオープンクローズドの原則を破るはありません

おすすめ

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