私は少し困惑しています。私は class を持っていanimal
ます。位置などの基本的なものを格納しているとしましょう。それで、smartAnimal
拡張するクラスがありますanimal
。smartAnimal
ユーザーの入力なしで意思決定できる機能を追加するとします。
今、私はdog
拡張するクラスを持っていますanimal
。smartAnimal
その機能を必要としないため、拡張しません。これまでのところ、私はうまくいっています: adog
は でanimal
あり、 asmartAnimal
はanimal
です。しかし今、私はsmartDog
それが拡張されることを望んでsmartAnimal
いsmartDog
ますが、dog
. たとえば、通常dog
の 、.sniff()
、.poop()
、およびの多くの機能.bark()
は my にも含まれている必要がありますがsmartDog
、Java では多重継承が許可されていないため、コードを文字通りコピーして貼り付けない限り、そうではありません。
私が持っていた場合、構成はエレガントではないようです:
class smartDog{
smartAnimal thisSmartAnimal;
dog thisDog; }
animal
...たとえば、位置などの「もの」を複製します。2 セットの位置変数を処理する必要があります。そして、 にあるプロパティの複製animal
。
複数のインターフェイスを継承することも、適切な解決策のようには思えません。たとえばdog
、インターフェイス.sniff()
、、、.poop()
および.bark()
の実装を変更して再実装する必要はなく、smartDog
他のクラスのために再実装する必要がないからです。
ここでのベストプラクティスは何ですか? つまり、クラスdog
とsmartDog
?の両方を持つことです。
編集:
いくつかのコメント/回答から、明確にさせてください。私の特定のプロジェクトでは、smartAnimal
実際には、それを制御するニューラル ネットワーク全体があります。これは大量のコードであり、インターフェイスに抽象化する意味がありません。NN 機能のコアは、それを持っている動物に関係なく同じですが、各smartAnimal
サブクラスは AI の「脳」の出力を異なる方法で実装します。逆に、各動物には独自の機能があり、人間が制御する場合でも、独自の AI エージェントが制御する場合でも同じように動作します。