それは非常に紛らわしく、時々フィールドが混ざってしまうからですか、それとも他の理由ですか? 許可されているのはC++ですが、Javaでは許可されていません??
例えば:
草食動物と肉食動物は動物に由来し、雑食動物は草食動物と肉食動物の両方に由来します。そのため、一部のフィールドが混同されることはありません。
それは非常に紛らわしく、時々フィールドが混ざってしまうからですか、それとも他の理由ですか? 許可されているのはC++ですが、Javaでは許可されていません??
例えば:
草食動物と肉食動物は動物に由来し、雑食動物は草食動物と肉食動物の両方に由来します。そのため、一部のフィールドが混同されることはありません。
クラスでの複数の継承が回避されるのはなぜですか? それは非常に紛らわしく、時々フィールドが混ざってしまうからですか、それとも他の理由ですか?
多重継承は、初心者のプログラマーにとって修正が困難な問題を引き起こす可能性があるため、しばしば回避されます。考えられる問題:
~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 はしばしば私の心を吹き飛ばし、実験中に悪い結果をもたらしました。
あなたが新しい場合は、今のところそれを避けてください。複数の継承は、私がリストしたシナリオ (グルー コードを記述せずに複数の異なるインターフェイスをサポートするクラス) で役立ちます。それ以外の場合はすべて回避でき、おそらく必要ありません。
言語に機能がある場合、その機能を使用する必要があるという意味ではありません。言語に評判の悪い機能がある場合でも、それを使用してはならないというわけではありません。状況に応じてツールを選択してください。