問題タブ [polymorphism]

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 投票する
19 に答える
795675 参照

c++ - 仮想デストラクタをいつ使用するか?

私はほとんどのOOP理論をしっかりと理解していますが、私を非常に混乱させているのは仮想デストラクタです。

デストラクタは、何があっても、チェーン内のすべてのオブジェクトに対して常に呼び出されると思いました。

いつそれらを仮想化するつもりですか、またその理由は何ですか?

0 投票する
7 に答える
2669 参照

c++ - C ++で不明な具象型のコピーを作成する

次のクラス階層があるとします。

またはオブジェクトのBase*いずれかを指す可能性がある場合、具体的なタイプが不明な場合、実際のオブジェクトのコピーを作成するにはどうすればよいですか。コピー コンストラクターを定義することを考えましたが、関連する実際の型を知らなければ、これは不可能だと思います。私が考えることができる唯一の解決策は、階層内の各型でメソッドを定義することです。もっとエレガントなものを考えられる人はいますか?Derived1Derived2clone()

0 投票する
4 に答える
1707 参照

c# - ダウンキャストを回避することは可能ですか?

次のようないくつかのユーザー定義型を定義して使用するロジックがあります。

ロジックは、タイプを使用して計算を行った後 (各Wordインスタンスを検索するなど)、メソッドSystemを呼び出すなどして、いくつかの API を間接的に使用しますCanvass.draw

このロジックを名前空間から独立させたいと思いSystem.Drawingます。ほとんどの場合、単体テストを支援するためです (drawメソッドが実際のインスタンス以外のものに描画されている場合、単体テストの出力を確認する方が簡単だと思いSystem.Drawing.Graphicsます)。

ロジックのネームスペースへの依存を排除​​するために、型System.Drawingのプレースホルダーとして機能するいくつかの新しいインターフェイスを宣言すると考えました。次に例を示します。System.Drawing

これを行った場合、さまざまなアセンブリにIMyFontandIMyGraphicsインターフェイスのさまざまな実装が含まれる可能性があります。たとえば...

...ただし、実装には上記のようにダウンキャストが必要です。

私の質問は、実装でダウンキャストを必要とせずにこれを行う方法はありますか? 「これ」とは、「特定の具体的な型に依存しないような UDT を定義する」ことを意味WordCanvassますSystemか?

代替手段は抽象UDTです...

...しかし、これもサブクラスの実装でダウンキャストが必要になります。

また、ダブル ディスパッチ イディオムを使用することも考えましたが、API でさまざまなサブクラスに名前を付けることに依存しています。

または、インターフェイスまたはサブクラスを使用しない場合、デリゲートを使用する方法はありますか?


- 編集: -

考えられる答えは 2 つあります。

1つの答えは、ジェネリックを使用することです。これは、以下の「Sir Lantis」の回答で示唆されているとおり、およびJohn Skeetがリンクしているブログ投稿で示唆されているとおりです。これはほとんどのシナリオでうまくいくと思います。私の観点からのマイナス面はTFont、テンプレートパラメータとして導入することを意味することです:それは、ジェネリッククラス(のような)になる必要がWordあるのは、(インスタンスを含む)のようなクラスだけではありません...それはまた、(eg )を含むクラスも、パラメーター (eg ) を使用してジェネリックにする必要があります。最終的に、アセンブリ内のほぼすべてのクラスがジェネリック クラスになりました。これにより、タイプセーフ維持され、ダウンキャストの必要がなくなります...しかしFontWordT<TFont>WordT<TFont>ParagraphTFontParagraphT<TFont>それは一種の醜いものであり、カプセル化の錯覚 (「フォント」が不透明な実装の詳細であるという錯覚) を妨げます。

もう 1 つの答えは、ユーザー クラスでマップまたは辞書を使用することです。再利用可能なライブラリの代わりFontに、抽象インターフェイスの代わりに、次のような「ハンドル」クラスを定義します。

次に、からダウンキャストする代わりに、値をインスタンスにマップFontHandleするインスタンスを保持します。Dictionary<int, Font>FontHandleFont

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

java - Java での継承 - 「シンボル コンストラクターが見つかりません」

別のクラスから継承するクラスに取り組んでいますが、「シンボル コンストラクター Account() が見つかりません」というコンパイラ エラーが発生します。基本的に私がやろうとしているのは、Account から拡張するクラス InvestmentAccount を作成することです - Account は、お金を引き出し/入金する方法で残高を保持することを目的としていますが、InvestmentAccount は似ていますが、残高は株価によってどのように決定されるかを示す株式に保存されます特定の金額を指定すると、多くの株式が預け入れまたは引き出されます。サブクラス InvestmentAccount の最初の数行 (コンパイラが問題を指摘したあたり) を次に示します。

Person クラスは、別のファイル (Person.java) に保持されます。スーパークラス Account の最初の数行は次のとおりです。

コンパイラが Account クラスから Account のシンボル コンストラクターを読み取るだけではない理由はありますか? それとも、すべてを継承するように指示する InvestmentAccount 内の Account の新しいコンストラクターを定義する必要がありますか?

ありがとう

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

language-agnostic - ポリモーフィズムは、ループ内の if-else ステートメントをどのように置き換えることができますか?

ポリモーフィズムは、ループ内の if-else ステートメントまたは Switch をどのように置き換えることができますか? 特に、常に if-else を置き換えることができますか? ループ内で使用する if-then のほとんどは、算術比較です。この質問は、この質問から生まれました。

これはポリモーフィズムでどのように機能しますか?
注: 私はこれを Java で書きましたが、任意の OOL でこれに興味があります。

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

c - CでOOスタイルのポリモーフィズムをシミュレートするにはどうすればよいですか?

オブジェクト指向のようなコードをCプログラミング言語で書く方法はありますか?


以下も参照してください。

「[c]oo」で検索すると出てきます。

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

language-agnostic - TDD とのインターフェースへの開発

私は TDD の大ファンで、最近の開発の大部分で TDD を使用しています。ただし、私が頻繁に遭遇する状況の 1 つは、次の (不自然な) 例のようなものです。

次のようなインターフェースがあるとします (Java で記述していますが、実際には、これはどの OO 言語にも当てはまります)。

ここで、このインターフェースの 3 つの実装を作成したいとします。DijkstraPathFinderそれらを 、DepthFirstPathFinder、および と呼びましょうAStarPathFinder

問題は、TDD を使用してこれら 3 つの実装をどのように開発するかということです。getShortestPath() と getShortestPathLength() の結果は 3 つの実装すべてで一貫している必要があるため、それらのパブリック インターフェイスは同じになります。おそらく、それぞれに同じテストを記述します。

私の選択は次のようです:

  1. PathFinder最初の実装をコーディングするときに、1 セットのテストを作成します。次に、他の 2 つの実装を「ブラインド」で記述し、それらがPathFinderテストに合格することを確認します。2 番目の 2 つの実装クラスの開発に TDD を使用していないため、これは正しくないようです。

  2. テストファーストの方法で各実装クラスを開発します。クラスごとに同じテストを書くことになるので、これは正しくないようです。

  3. 上記の 2 つの手法を組み合わせます。これで、インターフェイスに対する一連のテストと、各実装クラスに対する一連のテストができました。これは良いことですが、テストはすべて同じであり、良いことではありません。

これは、特に Strategy パターンを実装する場合には、かなり一般的な状況のように思えます。もちろん、実装間の違いは時間の複雑さだけではありません。他の人はこの状況をどのように処理しますか? 私が認識していないインターフェイスに対するテスト ファースト開発のパターンはありますか?

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

c# - インターフェイス構成を使用した奇妙なインターフェイス ポリモーフィズム

私が取り組んでいるプロジェクトで、次のコードのようなものになりました。私はそれを許されたことは本当に奇妙だと思いましたが、今では、私の側の建築上の失敗が私をこれに導いた可能性が最も高いのだろうかと考え始めています.

あなたへの私の質問は次のとおりです。

  • これは正確には何と呼ばれていますか?
  • これは実際にどのような用途に使用されていますか?
  • なぜ誰もがこれをやりたいのですか?

ここに私のインターフェースがあります:

ここに私の具象クラスがあります:

そして私の合格テスト:

0 投票する
4 に答える
317 参照

.net - アクセサをオーバーライドして.NETのプロパティに追加することはできますか?

このようなことは可能ですか?

つまり、基本クラスは GET アクセサーのみを持つ仮想プロパティを提供しますが、子クラスは GET をオーバーライドし、SET も提供します。

現在の例はコンパイルされませんが、おそらくここに何かが欠けています。

追加:明確にするために、いいえ、new で再定義したくありません。新しいアクセサを追加したい。基本クラスにないことはわかっているので、オーバーライドできません。わかりました、シンタックス シュガーなしでどのように見えるかを説明してみましょう。

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

c++ - SWIG を使用した C++ と Ruby 間のポリモーフィズム

SWIG を使用して、Ruby スクリプトを C++ ライブラリにラップします。Ruby では、C++ クラスから継承できますが、結果のポインターを C++ 関数にポリモーフィックに渡すことはできません。

これが具体的な例です。SWIG インターフェイス ファイルは、仮想関数 sound() を持つ基本クラス Animal を定義します。

私はクロスランゲージ ポリモーフィズムのために SWIG ディレクタを使用していますが、これは機能していないようです。Ruby スクリプトは次のようになります。

スクリプトの最終行で次のエラーが発生します。

どういうわけか、SWIG では、Ruby オブジェクトをアニマルへのポインターとして扱うことができません。何か案は?