問題タブ [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 投票する
7 に答える
7709 参照

c++ - このコードで仮想メソッドを呼び出すと、セグメンテーション違反が発生するのはなぜですか?

私はまだ C++ を学んでいます。ポリモーフィズムがどのように機能するかを試していたところ、仮想メソッドを呼び出すときにセグメンテーション違反が発生しました。

(注:デストラクタを仮想としてマークしませんでした。何が起こるかを確認しようとしていました。)コードは次のとおりです。

また、Java でこれらの概念を知っている人のために、一般的な継承とポリモーフィズムの使用法に関するその他のヒントがあれば、私に知らせてください。ありがとうございました!

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

ruby - 「メッシーポリモーフィズム」アンチパターン

かなり大規模な Ruby アプリケーションでは、特定のオブジェクトが名前と ID などの 2 つの要素によって識別される状況があります。これらの値の型はそれぞれ多少異なる目的を果たしているため、厳密には同じではありません (ID と名前は別の場所に保持されます)。そのため、アプリケーション全体でさまざまな値 (ID、名前、オブジェクト) が渡されます。この状況は、特定の関数にどの型を渡す必要があるかが明確でないというバグにすでに悩まされているため、少なくともある程度は問題のように思えます。具体的な名前を付けたことは一度もありませんが、実際には、何年にもわたって多くのアプリケーションで同様の問題コードを見たことを思い出します。

型のない言語である Ruby では、C++ のように従来の型ベースの多相関数を使用できません。回避策として、同僚はしばしば次のようなコードを使用しています。

私たちのコードベース (イニシャライザだけでなく) の周りにこのコードが急増すると、私が「乱雑なポリモーフィズム」と呼ぶ結果になります。多くの場合は機能しますが、非常に不可解な状況が生じることもあります。

これについて 3 つの質問があります。

  • アンチパターンとしてこれに正式な名前はありますか? 「乱雑なインターフェイス?」、「乱雑なポリモーフィズム?」または、他の何か?
  • 人々はこれがどれほど悪いと思うでしょうか?
  • これをリファクタリングする体系的な方法はありますか? 私たちが作成した多くのテストがこのルーズタイピングを使用しているため、テストと実装の両方を同時に変更する必要があり、通常のテストベースのリファクタリングの足場効果がないという、通常のリファクタリングでの課題です。この緩やかなポリモーフィズムを実際に「強化」し、コードをすぐに切り取るのではなく、関数に抽象化することができると思います。しかし、これは良い考えでしょうか?
0 投票する
2 に答える
2425 参照

c# - C# ポリモーフィズム - 仮想プロパティ

今回は仮想フィールドに問題があります。

ゲームオブジェクトのコアクラスがあります。このクラスには、Model クラス オブジェクトを含むフィールドが含まれています。モデルのオブジェクトには、位置などの値が含まれています。

今-描画中に、モデルから各オブジェクトの位置を読み取る必要があります。問題は、デフォルトのモデルクラスの代わりに派生を使用しているときに始まります。例:

モデルをフィールドではなく仮想プロパティとして定義しようとしましたが、派生プロパティはそのベースと同じ型でなければならないため、これは失敗します。他の多くのモデル タイプがあるため、キャスティングは無駄です。ベースからではなく、派生クラスから値を読み取りたい場合はどうすればよいですか?

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

c# - C# ポリモーフィズムの質問が再び - フィールドをオーバーライドしますか?

今回は仮想フィールドに問題があります。

ゲームオブジェクトのコアクラスがあります。このクラスには、Model クラス オブジェクトを含むフィールドが含まれています。モデルのオブジェクトには、位置などの値が含まれています。

今-描画中に、モデルから各オブジェクトの位置を読み取る必要があります。問題は、デフォルトのモデルクラスの代わりに派生を使用しているときに始まります。例:

モデルをフィールドではなく仮想プロパティとして定義しようとしましたが、派生プロパティはそのベースと同じ型でなければならないため、これは失敗します。他の多くのモデル タイプがあるため、キャスティングは無駄です。ベースからではなく、派生クラスから値を読み取りたい場合はどうすればよいですか?

私はすでにこの質問をしましたが、答えは解決策をもたらしませんでした。説明:

  • インターフェイス IGameObjectModel を使用する

    コンセプトは良いのですが、フィールドを強制する必要があります。インターフェイスはフィールドを定義できないため、プロパティを定義する必要があります。しかし、Position はフィールドではないため、IGameObjectModel.Position.X=10 を実行できません。

  • GenericGameObject を GenericGameObject や Missile などのジェネリック タイプにするために、GenericGameObject から派生したタイプにするため に、ミサイルを GenericGameObject にキャストして、通常はそれらのオブジェクトを同じリストに格納することができませんでした。もちろん、これら 2 つが継承できる主な基本型を作成することはできますが、Model フィールドにアクセスすることはできません。

  • モデルをフィールドではなくプロパティにします。 派生クラスのプロパティ タイプを変更することはできません。

どうすればいいですか?

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

java - スーパークラスはオーバーライドされたメソッドを呼び出さないのですか?

私は次のクラスを持っています:

ここでbar.b()を呼び出すとき、fooでオーバーライドされたメソッドa()を呼び出すようにします。ただし、「a」は出力されます。

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

c++ - C++ ポリモーフィズムはポインターツーポインターでサポートされていません

ポインターをきれいにする適切な方法を探しています。ここにコード例があります:

しかし、コンパイラはエラーを出します:

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

c++ - Derived*からBase*への変換&

私は、次のようにポインタへのポインタではなく、ポインタへの参照を渡すことによって、ここで言及されている質問に答えようとしていました。

ただし、これにより、32行目に次のコンパイラエラーが発生します。

エラーC2664:'RemoveObj':パラメータ1を'子*'から'親*&'に変換できません

子**から親**への変換は許可されないことに同意します。しかし、なぜこの変換も許可されていないのですか?