2

私は少し困惑しています。私は class を持っていanimalます。位置などの基本的なものを格納しているとしましょう。それで、smartAnimal拡張するクラスがありますanimalsmartAnimalユーザーの入力なしで意思決定できる機能を追加するとします。

今、私はdog拡張するクラスを持っていますanimalsmartAnimalその機能を必要としないため、拡張しません。これまでのところ、私はうまくいっています: adogは でanimalあり、 asmartAnimalanimalです。しかし今、私はsmartDogそれ拡張されることを望んでsmartAnimalsmartDogますが、dog. たとえば、通常dogの 、.sniff().poop()、およびの多くの機能.bark()は my にも含まれている必要がありますがsmartDog、Java では多重継承が許可されていないため、コードを文字通りコピーして貼り付けない限り、そうではありません。

私が持っていた場合、構成はエレガントではないようです:

class smartDog{ smartAnimal thisSmartAnimal; dog thisDog; }

animal...たとえば、位置などの「もの」を複製します。2 セットの位置変数を処理する必要があります。そして、 にあるプロパティの複製animal

複数のインターフェイスを継承することも、適切な解決策のようには思えません。たとえばdog、インターフェイス.sniff()、、、.poop()および.bark()の実装を変更して再実装する必要はなく、smartDog他のクラスのために再実装する必要がないからです。

ここでのベストプラクティスは何ですか? つまり、クラスdogsmartDog?の両方を持つことです。

編集:

いくつかのコメント/回答から、明確にさせてください。私の特定のプロジェクトでは、smartAnimal実際には、それを制御するニューラル ネットワーク全体があります。これは大量のコードであり、インターフェイスに抽象化する意味がありません。NN 機能のコアは、それを持っている動物に関係なく同じですが、各smartAnimalサブクラスは AI の「脳」の出力を異なる方法で実装します。逆に、各動物には独自の機能があり、人間が制御する場合でも、独自の AI エージェントが制御する場合でも同じように動作します。

4

3 に答える 3

3

答えは、これは現実的な継承階層ではないということです。これは、サブクラスにメソッドを追加することを説明するために「いくつかの機能を追加する」という言葉を使用したという事実からわかります。これは適切な継承ではありません。適切な継承(少なくともJavaでは)では、すべてのメソッドが継承階層の最上位に存在する必要があります。継承はコードの再利用のためのものであり、ツリーの奥深くに行くときに機能を追加するためのものではありません。したがって、与えられたようにあなたの質問に対する答えは実際にはありません。

于 2013-02-24T23:53:15.393 に答える
2

ここではJavaについて話しているので、モデルは複数のインターフェースを持つ単一継承です。

そうは言っても、これらの例を考えると、適切なレベルの抽象化が適切です。つまり、答えは次の組み合わせにあります。

  1. 適切な継承(「is a」、「has a」、および動作に関するGOFの本を参照)。「犬は賢い」と言っていることに気付いた場合、それはおそらく犬と「犬はママ」の行動です(名詞と形容詞に注意してください)。「賢い」犬は、愚かな犬とは異なる特定の行動を示しますが、データモデリングの観点からは両方とも「犬」です。
  2. 適切な集約。多くの場合、複雑な「もの」を構成要素に分割すると便利だと思います。したがって、「車」はエンジン、トランスミッション、シャーシなどで構成されます。犬には毛皮(色、質感など)、脚、頭、体型などがあり、次の場合にそのように区別することが適切な場合があります。犬が何であるかと犬の行動を区別する(スマート=インターフェース)。
  3. 抽象インターフェース。この例で難しいのは、「スマート」とは、オブジェクトや名詞の種類によって異なる場合があることです。「スマート」な犬はコマンドを理解できるかもしれませんが、「スマート」な電話には電子メールなどの特定の機能があります。したがって、「スマート」は最高レベルでは適切なインターフェースではないかもしれませんが、「哺乳類」に関連付けられている可能性があります->哺乳類である「犬」は、Mammal.Smartインターフェース(哺乳類に固有)を実装している可能性があります。

これは確かに、情報モデリングとコンピュータサイエンス全体のより困難で重要な側面の1つです。本や研究のグループ全体がこの1つのトピックに専念しているため、Stack Overflowの質問としては適切でない場合があります。これは、簡単で簡潔な質問に対する簡単で簡単な回答を提供することを目的としています。

于 2013-02-24T23:54:42.697 に答える
2

あなたが探しているのは、「デフォルト実装」と呼ばれる新しいJDK 8機能だと思います

それがなければ賢明な解決策は、犬にスマートアニマルを継承させることだと思います。そのため、smartDog は動物である smartAnimal である犬です。

オブジェクトが何を実装しているかに大きく依存するため、より正確なアドバイスを得ることは困難です。(たとえば、それらはすべて内部状態を持っていますか? それとも、新しい動作を定義しているだけですか?)

于 2013-02-24T23:49:23.343 に答える