-3

それは非常に紛らわしく、時々フィールドが混ざってしまうからですか、それとも他の理由ですか? 許可されているのはC++ですが、Javaでは許可されていません??

例えば:

草食動物と肉食動物は動物に由来し、雑食動物は草食動物と肉食動物の両方に由来します。そのため、一部のフィールドが混同されることはありません。

4

2 に答える 2

1

クラスでの複数の継承が回避されるのはなぜですか? それは非常に紛らわしく、時々フィールドが混ざってしまうからですか、それとも他の理由ですか?

多重継承は、初心者のプログラマーにとって修正が困難な問題を引き起こす可能性があるため、しばしば回避されます。考えられる問題:

  1. ダイヤモンドの継承。
  2. 慎重に設計されていない複数のインターフェイスを不用意に継承すると、オブジェクトの「public」または「protected」セクションが、この特定のオブジェクトにはあまり役に立たないメソッドで汚染される可能性があります。
  3. オブジェクトが他のいくつかのオブジェクトを継承する場合、構築/破棄の順序に注意する必要があります。そうしないと、二重削除などによって引き起こされる未定義の動作が原因でクラッシュする可能性があります。つまり、オブジェクト C がオブジェクト A と B を継承し~A、オブジェクト B によって提供されるものを何らかの方法で使用する場合は、 の~A前に呼び出す必要があります~B。つまり、このシナリオでclass C: public B, public A{}:は機能しますがclass C: public A, public B{};、破壊されるとクラッシュします。このようなバグは見つけるのが難しい場合があります。

Javaではありませんか??

そのためにJavaの質問をしてください。

許可されているのは C++ です

多重継承は便利なので、C++ で使用できます。

典型的なシナリオ - クラスがサポートしなければならない抽象インターフェースがいくつかあります。「IReader」、「IWriter」、「IUglyObject」としましょう。共通の祖先を持たないもの。多重継承なしで複数のインターフェイスをサポートするには、すべてのインターフェイスに共通の祖先があることを確認する必要があります (常に可能であるとは限りません)。または、追加のクラス (サポートしたいインターフェイスから派生したもの) を定義する必要があります。クラスから派生クラスに呼び出しを転送する大量のグルー コード。これは入力が多すぎます。多重継承を使用すると、すべてのインターフェイスを単純に保護継承し、必要なインターフェイスへのポインターを返すいくつかのメソッドを追加できます。

class MyClass: protected ISomething, protected ISomethingElse{
public:
    ISomething* getSomethingInterface(){ return this;}
    ISomethingElse* getSomethingEkseInterface(){ return this;}
protected:
};

草食動物と肉食動物は動物に由来し、雑食動物は草食動物と肉食動物の両方に由来します。そのため、一部のフィールドが混同されることはありません。

クラスの階層を設計するには多くの方法があり、この例で使用した方法は完全ではありません。たとえば、「摂食行動」クラスを抽象化し、「動物」に格納できます。これにより、動物の行動をその場で変更し、ウサギを一時的に肉食動物に変えることができます。または、動物が受け入れる食品の種類のリストを返す (または、この動物が食品を受け入れるかどうかをテストする) 仮想メソッドを作成して、目玉焼きだけを食べたいアニメルを作成することもできます。他の方法があります。

クラス階層は現実世界を模倣する必要はありません...

私がまだ C++ を学んでいたとき、MI はしばしば私の心を吹き飛ばし、実験中に悪い結果をもたらしました。

あなたが新しい場合は、今のところそれを避けてください。複数の継承は、私がリストしたシナリオ (グルー コードを記述せずに複数の異なるインターフェイスをサポートするクラス) で役立ちます。それ以外の場合はすべて回避でき、おそらく必要ありません。

言語に機能がある場合、その機能を使用する必要があるという意味ではありません。言語に評判の悪い機能がある場合でも、それを使用してはならないというわけではありません。状況に応じてツールを選択してください。

于 2013-08-26T14:15:55.683 に答える