タグ付けされた質問 「multiple-inheritance」

クラスが複数のスーパークラスまたは基本クラスから動作と機能を継承できる、一部のオブジェクト指向コンピュータープログラミング言語の機能。

16
ミックスインとは何ですか?なぜそれらが便利なのですか?
「Programming Python」では、Mark Lutzが「mixins」について言及しています。私はC / C ++ / C#の出身ですが、以前にその用語を聞いたことがありません。ミックスインとは何ですか? この例の行の間を読むと(非常に長いためにリンクしています)、「適切な」サブクラス化ではなく、多重継承を使用してクラスを拡張するケースであると思います。これは正しいですか? 新しい機能をサブクラスに入れるのではなく、なぜそれをしたいのですか?それについて、ミックスイン/マルチ継承アプローチがコンポジションを使用するよりも優れているのはなぜですか? ミックスインと多重継承を区別するものは何ですか?それは単なる意味論の問題ですか?

15
Pythonのsuper()は多重継承でどのように機能しますか?
私はPythonオブジェクト指向プログラミングでかなり新しいsuper()ので、特に多重継承に関しては、関数(新しいスタイルクラス)を理解するのに苦労しています。 たとえば、次のような場合: class First(object): def __init__(self): print "first" class Second(object): def __init__(self): print "second" class Third(First, Second): def __init__(self): super(Third, self).__init__() print "that's it" 取得できないのは、Third()クラスが両方のコンストラクターメソッドを継承するかどうかです。はいの場合、どれがsuper()で実行されますか?その理由は? そして、もう一方を実行したい場合はどうなりますか?私はそれがPythonメソッド解決順序(MRO)と関係があることを知っています。

16
C#での複数の継承
多重継承は悪いので(ソースをより複雑にします)、C#はそのようなパターンを直接提供しません。しかし、この能力があると役立つ場合があります。 たとえば、インターフェイスとそのような3つのクラスを使用して、不足している多重継承パターンを実装できます。 public interface IFirst { void FirstMethod(); } public interface ISecond { void SecondMethod(); } public class First:IFirst { public void FirstMethod() { Console.WriteLine("First"); } } public class Second:ISecond { public void SecondMethod() { Console.WriteLine("Second"); } } public class FirstAndSecond: IFirst, ISecond { First first = new First(); Second …

6
多重継承で親クラス__init__を呼び出す、正しい方法は何ですか?
多重継承シナリオがあるとしましょう: class A(object): # code for A here class B(object): # code for B here class C(A, B): def __init__(self): # What's the right code to write here to ensure # A.__init__ and B.__init__ get called? 書き込みには、2つの典型的なアプローチがありますCのは__init__: (旧式) ParentClass.__init__(self) (新しいスタイル) super(DerivedClass, self).__init__() ただし、どちらの場合でも、親クラス(AとB)が同じ規則に従っていない場合、コードは正しく機能しません(一部が見つからないか、複数回呼び出される可能性があります)。 では、正しい方法は何でしょうか?「ただ一貫している、どちらか一方に従っている」と言うのは簡単ですが、サードパーティのライブラリからのものである場合、AまたはBサードパーティのライブラリからのものである場合はどうでしょうか。すべての親クラスのコンストラクターが(正しい順序で、1回だけ)呼び出されるようにする方法はありますか? 編集:私がそうしている場合、私が何を意味するかを確認するには: class A(object): def __init__(self): print("Entering …

16
Java多重継承
Javaの多重継承問題を解決する方法を完全に理解するために、私は明確にする必要のある古典的な質問をします。 私はクラスを持っているとしましょうAnimal、これはサブクラスを持っているBirdとHorse、私はクラスにする必要があるPegasusから延びBirdかつHorse以来、Pegasus鳥と馬の両方です。 これは古典的なダイヤモンドの問題だと思います。これを解決する古典的な方法を私が理解できることからAnimal、BirdとHorseクラスをインターフェイスにしてPegasus、それらから実装することができます。 まだ鳥や馬のオブジェクトを作成できるという問題を解決する別の方法があるのか​​と思っていました。動物を作成できる方法があれば、それも素晴らしいことですが、必須ではありません。


9
2つのジェネリック型を持つ1つのインターフェースを実装するJavaクラスを作成する方法は?
汎用インターフェースがあります public interface Consumer<E> { public void consume(E e); } 2つのタイプのオブジェクトを使用するクラスがあるので、次のような処理を行います。 public class TwoTypesConsumer implements Consumer<Tomato>, Consumer<Apple> { public void consume(Tomato t) { ..... } public void consume(Apple a) { ...... } } どうやらできません。 もちろん、ディスパッチを自分で実装することもできます。 public class TwoTypesConsumer implements Consumer<Object> { public void consume(Object o) { if (o instanceof Tomato) …


17
JavaScriptでの複数の継承/プロトタイプ
JavaScriptである種の初歩的な多重継承が必要になるところまで来ました。(これが良いアイデアであるかどうかについて話し合うためにここにいるわけではないので、それらのコメントはご自分で保管してください。) 私は誰かがこれを試みて成功したかどうかを知りたいのですが、彼らはどうやってそれをやりましたか? それを要約すると、私が本当に必要なのは、複数のプロトタイプチェーンからプロパティを継承できるオブジェクトを持つことができることです(つまり、各プロトタイプは独自の適切なチェーンを持つことができます)。チェーンを検索して、最初の定義を探します。 これがどのように理論​​的に可能であるかを示すために、プライマリチェーンの最後にセカンダリチェーンを接続することで実現できますが、これは以前のプロトタイプのすべてのインスタンスに影響し、それは私が望むものではありません。 考え?

7
インターフェースはJavaの複数のインターフェースを拡張できますか?
インターフェースはJavaの複数のインターフェースを拡張できますか?このコードは私のIDEで有効であるように見え、コンパイルされます: interface Foo extends Runnable, Set, Comparator<String> { } しかし、Javaでは多重継承が許可されていないと聞いていました。インターフェースに例外があるように見えるのはなぜですか?

11
多重継承の正確な問題は何ですか?
C#またはJavaの次のバージョンに多重継承を含めるかどうかを常に尋ねる人がいます。この能力を持つ幸運なC ++の人々は、これは誰かが最終的に自分自身を吊るすためのロープを与えるようなものだと言います。 多重継承の問題は何ですか?具体的なサンプルはありますか?

17
JavaまたはC#で多重継承が許可されないのはなぜですか?
JavaとC#では多重継承が許可されていないことを知っています。多くの本では、多重継承は許可されていません。ただし、インターフェイスを使用して実装できます。それが許可されない理由については何も議論されていません。なぜそれが許可されていないのか正確に誰かに教えてもらえますか?

5
仮想継承はどのようにして「ダイヤモンド」(多重継承)のあいまいさを解決しますか?
class A { public: void eat(){ cout<<"A";} }; class B: virtual public A { public: void eat(){ cout<<"B";} }; class C: virtual public A { public: void eat(){ cout<<"C";} }; class D: public B,C { public: void eat(){ cout<<"D";} }; int main(){ A *a = new D(); a->eat(); } ダイヤモンドの問題を理解しています。上記のコードにはその問題はありません。 …

3
Objective-Cの多重継承
2つのクラスがあり、1つはmethodAを含み、もう1つはmethodBを含みます。新しいクラスでは、メソッドmethodAとmethodBをオーバーライドする必要があります。では、どうすれば目的Cで多重継承を実現できますか?構文に少し混乱しています。

7
Java-インターフェース実装でのメソッド名の衝突
2つのインターフェースがあり、どちらも目的がまったく異なりますが、メソッドの署名が同じである場合、両方のインターフェースに役立つ単一のメソッドを記述したり、メソッドに複雑なロジックを記述したりせずに、クラスに両方を実装させるにはどうすればよいですか?呼び出しが行われているオブジェクトのタイプをチェックし、適切なコードを呼び出す実装? C#では、これは明示的なインターフェイス実装と呼ばれるものによって克服されます。Javaに同等の方法はありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.