問題タブ [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.
c++ - 仮想デストラクタをいつ使用するか?
私はほとんどのOOP
理論をしっかりと理解していますが、私を非常に混乱させているのは仮想デストラクタです。
デストラクタは、何があっても、チェーン内のすべてのオブジェクトに対して常に呼び出されると思いました。
いつそれらを仮想化するつもりですか、またその理由は何ですか?
c++ - C ++で不明な具象型のコピーを作成する
次のクラス階層があるとします。
またはオブジェクトのBase*
いずれかを指す可能性がある場合、具体的なタイプが不明な場合、実際のオブジェクトのコピーを作成するにはどうすればよいですか。コピー コンストラクターを定義することを考えましたが、関連する実際の型を知らなければ、これは不可能だと思います。私が考えることができる唯一の解決策は、階層内の各型でメソッドを定義することです。もっとエレガントなものを考えられる人はいますか?Derived1
Derived2
clone()
c# - ダウンキャストを回避することは可能ですか?
次のようないくつかのユーザー定義型を定義して使用するロジックがあります。
ロジックは、タイプを使用して計算を行った後 (各Word
インスタンスを検索するなど)、メソッドSystem
を呼び出すなどして、いくつかの API を間接的に使用しますCanvass.draw
。
このロジックを名前空間から独立させたいと思いSystem.Drawing
ます。ほとんどの場合、単体テストを支援するためです (draw
メソッドが実際のインスタンス以外のものに描画されている場合、単体テストの出力を確認する方が簡単だと思いSystem.Drawing.Graphics
ます)。
ロジックのネームスペースへの依存を排除するために、型System.Drawing
のプレースホルダーとして機能するいくつかの新しいインターフェイスを宣言すると考えました。次に例を示します。System.Drawing
これを行った場合、さまざまなアセンブリにIMyFont
andIMyGraphics
インターフェイスのさまざまな実装が含まれる可能性があります。たとえば...
...ただし、実装には上記のようにダウンキャストが必要です。
私の質問は、実装でダウンキャストを必要とせずにこれを行う方法はありますか? 「これ」とは、「特定の具体的な型に依存しないような UDT を定義する」ことを意味Word
しCanvass
ますSystem
か?
代替手段は抽象UDTです...
...しかし、これもサブクラスの実装でダウンキャストが必要になります。
また、ダブル ディスパッチ イディオムを使用することも考えましたが、API でさまざまなサブクラスに名前を付けることに依存しています。
または、インターフェイスまたはサブクラスを使用しない場合、デリゲートを使用する方法はありますか?
- 編集: -
考えられる答えは 2 つあります。
1つの答えは、ジェネリックを使用することです。これは、以下の「Sir Lantis」の回答で示唆されているとおり、およびJohn Skeetがリンクしているブログ投稿で示唆されているとおりです。これはほとんどのシナリオでうまくいくと思います。私の観点からのマイナス面はTFont
、テンプレートパラメータとして導入することを意味することです:それは、ジェネリッククラス(のような)になる必要がWord
あるのは、(インスタンスを含む)のようなクラスだけではありません...それはまた、(eg )を含むクラスも、パラメーター (eg ) を使用してジェネリックにする必要があります。最終的に、アセンブリ内のほぼすべてのクラスがジェネリック クラスになりました。これにより、タイプセーフが維持され、ダウンキャストの必要がなくなります...しかしFont
WordT<TFont>
WordT<TFont>
Paragraph
TFont
ParagraphT<TFont>
それは一種の醜いものであり、カプセル化の錯覚 (「フォント」が不透明な実装の詳細であるという錯覚) を妨げます。
もう 1 つの答えは、ユーザー クラスでマップまたは辞書を使用することです。再利用可能なライブラリの代わりFont
に、抽象インターフェイスの代わりに、次のような「ハンドル」クラスを定義します。
次に、からダウンキャストする代わりに、値をインスタンスにマップFontHandle
するインスタンスを保持します。Dictionary<int, Font>
FontHandle
Font
java - Java での継承 - 「シンボル コンストラクターが見つかりません」
別のクラスから継承するクラスに取り組んでいますが、「シンボル コンストラクター Account() が見つかりません」というコンパイラ エラーが発生します。基本的に私がやろうとしているのは、Account から拡張するクラス InvestmentAccount を作成することです - Account は、お金を引き出し/入金する方法で残高を保持することを目的としていますが、InvestmentAccount は似ていますが、残高は株価によってどのように決定されるかを示す株式に保存されます特定の金額を指定すると、多くの株式が預け入れまたは引き出されます。サブクラス InvestmentAccount の最初の数行 (コンパイラが問題を指摘したあたり) を次に示します。
Person クラスは、別のファイル (Person.java) に保持されます。スーパークラス Account の最初の数行は次のとおりです。
コンパイラが Account クラスから Account のシンボル コンストラクターを読み取るだけではない理由はありますか? それとも、すべてを継承するように指示する InvestmentAccount 内の Account の新しいコンストラクターを定義する必要がありますか?
ありがとう
language-agnostic - ポリモーフィズムは、ループ内の if-else ステートメントをどのように置き換えることができますか?
ポリモーフィズムは、ループ内の if-else ステートメントまたは Switch をどのように置き換えることができますか? 特に、常に if-else を置き換えることができますか? ループ内で使用する if-then のほとんどは、算術比較です。この質問は、この質問から生まれました。
これはポリモーフィズムでどのように機能しますか?
注: 私はこれを Java で書きましたが、任意の OOL でこれに興味があります。
c - CでOOスタイルのポリモーフィズムをシミュレートするにはどうすればよいですか?
オブジェクト指向のようなコードをC
プログラミング言語で書く方法はありますか?
以下も参照してください。
「[c]oo」で検索すると出てきます。
language-agnostic - TDD とのインターフェースへの開発
私は TDD の大ファンで、最近の開発の大部分で TDD を使用しています。ただし、私が頻繁に遭遇する状況の 1 つは、次の (不自然な) 例のようなものです。
次のようなインターフェースがあるとします (Java で記述していますが、実際には、これはどの OO 言語にも当てはまります)。
ここで、このインターフェースの 3 つの実装を作成したいとします。DijkstraPathFinder
それらを 、DepthFirstPathFinder
、および と呼びましょうAStarPathFinder
。
問題は、TDD を使用してこれら 3 つの実装をどのように開発するかということです。getShortestPath() と getShortestPathLength() の結果は 3 つの実装すべてで一貫している必要があるため、それらのパブリック インターフェイスは同じになります。おそらく、それぞれに同じテストを記述します。
私の選択は次のようです:
PathFinder
最初の実装をコーディングするときに、1 セットのテストを作成します。次に、他の 2 つの実装を「ブラインド」で記述し、それらがPathFinder
テストに合格することを確認します。2 番目の 2 つの実装クラスの開発に TDD を使用していないため、これは正しくないようです。テストファーストの方法で各実装クラスを開発します。クラスごとに同じテストを書くことになるので、これは正しくないようです。
上記の 2 つの手法を組み合わせます。これで、インターフェイスに対する一連のテストと、各実装クラスに対する一連のテストができました。これは良いことですが、テストはすべて同じであり、良いことではありません。
これは、特に Strategy パターンを実装する場合には、かなり一般的な状況のように思えます。もちろん、実装間の違いは時間の複雑さだけではありません。他の人はこの状況をどのように処理しますか? 私が認識していないインターフェイスに対するテスト ファースト開発のパターンはありますか?
c# - インターフェイス構成を使用した奇妙なインターフェイス ポリモーフィズム
私が取り組んでいるプロジェクトで、次のコードのようなものになりました。私はそれを許されたことは本当に奇妙だと思いましたが、今では、私の側の建築上の失敗が私をこれに導いた可能性が最も高いのだろうかと考え始めています.
あなたへの私の質問は次のとおりです。
- これは正確には何と呼ばれていますか?
- これは実際にどのような用途に使用されていますか?
- なぜ誰もがこれをやりたいのですか?
ここに私のインターフェースがあります:
ここに私の具象クラスがあります:
そして私の合格テスト:
.net - アクセサをオーバーライドして.NETのプロパティに追加することはできますか?
このようなことは可能ですか?
つまり、基本クラスは GET アクセサーのみを持つ仮想プロパティを提供しますが、子クラスは GET をオーバーライドし、SET も提供します。
現在の例はコンパイルされませんが、おそらくここに何かが欠けています。
追加:明確にするために、いいえ、new で再定義したくありません。新しいアクセサを追加したい。基本クラスにないことはわかっているので、オーバーライドできません。わかりました、シンタックス シュガーなしでどのように見えるかを説明してみましょう。
c++ - SWIG を使用した C++ と Ruby 間のポリモーフィズム
SWIG を使用して、Ruby スクリプトを C++ ライブラリにラップします。Ruby では、C++ クラスから継承できますが、結果のポインターを C++ 関数にポリモーフィックに渡すことはできません。
これが具体的な例です。SWIG インターフェイス ファイルは、仮想関数 sound() を持つ基本クラス Animal を定義します。
私はクロスランゲージ ポリモーフィズムのために SWIG ディレクタを使用していますが、これは機能していないようです。Ruby スクリプトは次のようになります。
スクリプトの最終行で次のエラーが発生します。
どういうわけか、SWIG では、Ruby オブジェクトをアニマルへのポインターとして扱うことができません。何か案は?