問題タブ [multiple-inheritance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
590 参照

python - 非ローカル等価でデコレータを実装する方法は?

こんにちは、現在、プログラムの 1 つをリファクタリングしていて、興味深い問題を発見しました。

オートマトンにトランジションがあります。遷移には常に開始状態と終了状態があります。一部のトランジションには、トラバーサル時に実行する必要がある特定のアクションをエンコードするラベルがあります。ラベルがないということは、アクションがないことを意味します。一部の遷移には条件があり、この条件をトラバースするために満たす必要があります。条件がない場合、遷移は基本的に NFA のイプシロン遷移であり、入力シンボルを消費せずにトラバースされます。

次の操作が必要です。

  • トランジションにラベルがあるかどうかを確認する
  • このラベルを入手
  • トランジションにラベルを追加する
  • 遷移に条件があるかどうかを確認する
  • この状態になる
  • 等しいかどうかを確認する

最初の 5 つのポイントから判断すると、これは明確なデコレーターのように思えます。基本遷移と 2 つのデコレーター (Labeled と Condition) があります。ただし、このアプローチには問題があります。開始状態と終了状態が同じで、両方の遷移のラベルが同じ (または存在しない) で、両方の条件が同じ (または存在しない) 場合、2 つの遷移は等しいと見なされます。 . デコレーターを使用すると、2 つの遷移 Labeled("foo", Conditional("bar", Transition("baz", "qux"))) と Conditional("bar", Labeled("foo", Transition("baz) ", "qux"))) 非ローカルの等価性が必要です。つまり、デコレーターはすべてのデータを収集する必要があり、遷移はこの収集されたデータをセットベースで比較する必要があります。

これはクリーンなアプローチですか?何か不足していますか?

私はこれを解決できるので、ほとんど混乱しています-より長いクラス名で-協調多重継承を使用します:

クラス LabledConditionalTransition は期待どおりに動作します。そこにコードがないことは魅力的であり、このサイズで MI が混乱することはありません。

もちろん、3 番目のオプションは、すべてを 1 つのトランジション クラスにまとめて、一連の has_label/has_transition にすることです。

だから...私は混乱しています。何か不足していますか?どちらの実装が見栄えがしますか? 同様のケース、つまり、Decorator で処理できるように見えるオブジェクトをどのように処理しますか?

EDIT : ConditionalTransition クラスを追加しました。基本的に、これはデコレータのように動作しますが、デコレータを作成する順序によって作成された順序を差し引いたものです。トランジションは開始と終了が正しいかどうかをチェックし、LabeledTransition クラスはラベルが正しいかどうかをチェックし、ConditionalTransition は条件が正しいかどうかをチェックします。

0 投票する
8 に答える
43172 参照

c++ - 多重継承を使用しているときに死のダイアモンドを回避するにはどうすればよいですか?

http://en.wikipedia.org/wiki/Diamond_problem

意味はわかりますが、回避するにはどうすればよいですか?

0 投票する
14 に答える
439142 参照

c# - C# での多重継承

多重継承は良くない (ソースが複雑になる) ため、C# はそのようなパターンを直接提供しません。しかし、この能力があると便利な場合もあります。

たとえば、インターフェイスとそのような 3 つのクラスを使用して、欠落している多重継承パターンを実装できます。

インターフェイスの 1 つにメソッドを追加するたびに、クラスFirstAndSecondも変更する必要があります。

C++ で可能なように、複数の既存のクラスを 1 つの新しいクラスに挿入する方法はありますか?

ある種のコード生成を使用した解決策があるのではないでしょうか?

または、次のようになります (架空の C# 構文)。

インターフェイスの 1 つを変更するときにクラス FirstAndSecond を更新する必要がないようにします。


編集

たぶん、実際の例を検討する方が良いでしょう:

プロジェクト内の別の場所で既に使用している既存のクラス (ITextTcpClient に基づくテキスト ベースの TCP クライアントなど) があります。Windows フォーム開発者が簡単にアクセスできるように、クラスのコンポーネントを作成する必要性を感じています。

私の知る限り、現在これを行うには2つの方法があります。

  1. FirstAndSecond で示されているように、コンポーネントから継承され、クラス自体のインスタンスを使用して TextTcpClient クラスのインターフェイスを実装する新しいクラスを作成します。

  2. TextTcpClient から継承し、何らかの形で IComponent を実装する新しいクラスを作成します (実際にはまだ試していません)。

どちらの場合も、クラスごとではなく、メソッドごとに作業を行う必要があります。TextTcpClient と Component のすべてのメソッドが必要になることがわかっているので、これら 2 つを 1 つのクラスに結合するのが最も簡単な解決策です。

競合を避けるために、これはコード生成によって行われ、結果は後で変更される可能性がありますが、これを手で入力するのは本当に面倒です。

0 投票する
34 に答える
10761 参照

c# - C# には多重継承が必要ですか?

私は、C# に多重継承を含めることに反対する多くの議論に出くわしました。

  • 多重継承は複雑すぎてあいまいな場合が多い
  • インターフェイスは同様のものを提供するため、不要です
  • コンポジションは、インターフェイスが不適切な場合の優れた代替手段です

私は C++ のバックグラウンドを持っているので、多重継承のパワーとエレガンスが恋しいです。すべてのソフトウェア設計に適しているわけではありませんが、インターフェイス、構成、および同様の OO 手法に対する有用性を否定するのが難しい状況があります。

多重継承の除外は、開発者がそれらを賢く使用するほど賢くなく、複雑さが生じたときに対処できないと言っているのですか?

個人的には、C# (おそらく C##) への多重継承の導入を歓迎します。


補遺: 単一 (または手続き型の背景) と複数の継承の背景から来る回答から知りたいです。多重継承の経験がない開発者は、パラダイムの経験がないという理由だけで、多重継承は不要であるという議論をデフォルトで行うことがよくあります。

0 投票する
11 に答える
259100 参照

python - Pythonで「スーパー」は何をしますか? - super().__init__() と明示的なスーパークラス __init__() の違い

次の違いは何ですか:

と:

super単一継承のみのクラスでかなり多く使用されているのを見てきました。多重継承で使用する理由はわかりますが、この種の状況で使用する利点については不明です。

0 投票する
11 に答える
82866 参照

oop - 多重継承の正確な問題は何ですか?

多重継承を C# または Java の次のバージョンに含める必要があるかどうかを常に尋ねる人を見かけます。幸運にもこの能力を持っている C++ の人々は、これは誰かに最終的に首を吊るすためのロープを与えるようなものだと言います。

多重継承の問題は何ですか?具体的なサンプルはありますか?

0 投票する
10 に答える
1254 参照

c++ - C++ で仮想継承よりも優れた方法を探している

OK、私は C++ でやや複雑なシステムを持っています。簡単に言えば、サード パーティの抽象基本クラスにメソッドを追加する必要があります。サードパーティは、新しい機能を必要とする大量の派生クラスも提供しています。

標準の Shape インターフェースといくつかの一般的な形状を提供するライブラリを使用しています。

さて、ここに私の問題があります。Shape クラスにも GetArea() 関数を含めたいと思います。だから私はただやるべきだと思う:

次に、ImprovedShape と Square を継承する ImprovementSquare を作成します。さて、ご覧のとおり、恐ろしいダイヤモンドの継承問題を作成しました。これは、サード パーティのライブラリが Square や Circle などに仮想継承を使用している場合、簡単に修正できます。しかし、それを実行させるのは合理的な選択肢ではありません。

では、ライブラリで定義されたインターフェイスにちょっとした機能を追加する必要がある場合はどうすればよいでしょうか? 良い答えはありますか?

ありがとう!

0 投票する
5 に答える
58997 参照

c++ - 2 つの派生クラスからの多重継承

インターフェイスとして機能する抽象基本クラスがあります。

抽象クラスの半分を実装する派生クラスの 2 つの「セット」があります。(一方の「セット」は初期化に関連する抽象仮想メソッドを定義し、もう一方の「セット」は実際の「作業」に関連するメソッドを定義します。)

次に、複数の継承を使用して完全に定義されたクラスを構築する派生クラスを作成します (それ自体は何も追加しません)。

だから:(悪い疑似コード)

まず、これでいいの?同じ Base から派生した 2 つのクラスを継承できますか? (そうだといい)。

ただし、これが「本当の問題」です(例を単純化するために少し上に嘘をつきました)。

私が実際に行ったことは、非抽象アクセサー メソッドを基本クラスに追加することです。

一般的なイディオムは、すべての仮想メソッドを非公開にすることです。

残念ながら、現在、AbsInit と AbsWork の両方がこれらのメソッドを継承しているため、NotAbsTotal は「それぞれ 2 つ」を継承しています (コンパイル時に実際に起こっていることを解体している可能性があることに気付きました)。

とにかく、g ++は、クラスを使用しようとすると「メンバーinit()のリクエストがあいまいです」と不平を言います。

AbsBase クラスを純粋なインターフェイスとして使用していれば、これは回避できたと思います (上の例が有効であると仮定します)。

だから: - 私は私の実装から離れていますか?- これは、仮想メソッドを非公開にするイディオムの制限ですか? - コードをリファクタリングして、やりたいことを実行するにはどうすればよいですか? (1 つの共通インターフェースを提供しますが、メンバー関数の「セット」の実装を交換する方法を許可します)

編集:

私は最初のものではないようです: http://en.wikipedia.org/wiki/Diamond_problem

ここでは仮想継承が解決策のようです。以前に仮想継承について聞いたことがありますが、それについて頭を悩ませたことはありません。私はまだ提案を受け付けています。

0 投票する
5 に答える
2698 参照

c++ - C++ の複数の仮想継承と COM の比較

ネット上には「恐怖のダイヤモンド問題」の解説があふれています。スタックオーバーフローも同様です。私はそれを少し理解していると思いますが、その知識を、似ているが異なるものの理解に変換することに失敗しています.

私の質問は純粋な C++ の質問として始まりますが、答えは MS-COM の仕様に分岐する可能性があります。一般的な問題の質問は次のとおりです。

これは、従来のダイヤモンド ソリューションではありません。ここで「仮想」は正確に何をしますか?

私の本当の問題は、CodeProject の友人の場所での議論を理解しようとすることです。これには、Flash プレーヤー用の透明なコンテナーを作成するためのカスタム クラスが含まれます。

私はこの場所を楽しみにしようと思いました。次の宣言により、バージョン 10 の Flash Player でアプリがクラッシュすることが判明しました。

デバッグは、関数の実装 (QueryInterface など) に入るときに、さまざまな呼び出し元から、さまざまな呼び出しに対してさまざまな "this" ポインター値を取得することを示しています。しかし、「仮想」を削除するとうまくいきます。クラッシュはなく、同じ「this」ポインター。

何が起こっているのかを正確に理解したいと思います。どうもありがとう。

乾杯アダム

0 投票する
6 に答える
4401 参照

python - Python で dict AND Exception から継承できないのはなぜですか?

次のクラスを取得しました:

一体何?

そして最悪なのは、例外が古いベースのクラスであるため、super() を試すことができないことです...

編集:そして、はい、継承/初期化の順序を切り替えようとしました。

EDIT2:Ubuntu8.10でCPython 2.4を使用しています。この種の情報が役立つことを最近知っています;-)。とにかく、この小さななぞなぞは、3 人の同僚の口を閉ざしてしまいました。あなたは今日の私の親友になるでしょう...