質問

している場合は様々なサブクラスの何かを、アルゴリズムで動作するインスタンスのサブクラスの場合の挙動のアルゴリズム種によってどの特定のサブクラスのインスタンスは、通常のオブジェクト指向することがでの使用方法

例えば、サブクラスでは、DOMノードのアルゴリズムの挿入を子ノードと、そのアルゴリズムが異なる親ノードをDOM要素を持つことができる子どもやDOMのテキストでない):その insertChildren メソッドの仮想(要旨) DomNode 基本クラスは、異なる方法で実行されそれぞれの DomElementDomText サブクラス.

もうひとつの可能性は、インスタンスで共通の財産、その値を読み取ることができ:例えば、アルゴリズムが読み込の nodeType 物件の DomNode ベースクラスまたはもう一つ例を挙げるとなければならなくなるかもしれ異なる種類(サブクラス)のネットワークパケットし、共通のパケットヘッダを読むことができipパケットのヘッダを見てどのようなパケットです。

まだ使用実行時の型情報を含む:

  • isas キーワードクライアントまで、フルのC#
  • Downcasting
  • のオブジェクトです。GetType法ッ純
  • typeid オペレーターで、C++

がんを追加するアルゴリズムにcgアルゴリズムによって異なりますの型のサブクラスが、私は新しい仮想メソッドのクラス上位の階層となります。

がこの質問にびっくりする時で適切な利用実行時の型の情報ではなく、仮想機能に?

役に立ちましたか?

解決

ときの周りの他の方法はありません。仮想メソッドは常に好ましいが、時には彼らは単に使用することはできません。これが起こる可能性がありますが、最も一般的なものは、あなたがあなたと仕事をしたいのクラスのソースコードを持っていないか、あなたがそれらを変更することができないことである理由のカップルがあります。あなたがレガシーシステムまたはクローズドソースの商用ライブラリで作業するときにしばしば起こります。

.NETでは、また、あなたがプラグインのように、その場で新しいアセンブリをロードするために持っていて、一般的に何の基底クラスを持っていないが、ダックタイピングのようなものを使用しなければならないことが起こるかもしれません。

他のヒント

C++、その他の無名の場合(主に扱劣るもののデザインカード番号を探せなくなるため,RTTIは実施で 多方法.

この構造(「ある」と「など」)は、イベントハンドラので、Delphiの開発者のために非常に精通している、通常は意気消沈したオブジェクトの共通の祖先へ。それはTButtonの、TListBoxコンポーネントまたは他の任意であるかどうかに関係なく、オブジェクトの種類のTObjectをたとえばイベントクリック時のみargurment送信者を通過させます。あなたはこのオブジェクトについて何かの詳細を知りたい場合は、を介してアクセスする必要がありますが、例外を避けるために、あなたがそれを確認することができます「と」前「です」。このダウンキャストは、厳密なクラスの型チェックで可能であることができなかったオブジェクトとメソッドの設計型が結合できます。ユーザーがボタンやリストボックスをクリックすると、同じことをしたい想像しますが、それらは機能の異なるプロトタイプを提供してくれるならば、同じ手順にバインドすることはできませんでした。

より一般的なケースでは、オブジェクトは、例えばオブジェクトが変更されたことを通知する機能を呼び出すことができます。しかし、事前に、それは必ずしも必要ではないが、(として通過している)、「個人的に」彼を知っている可能性先を残しています。これは、すべてのオブジェクトの最も共通の祖先としての自己を渡すことでこれを行います(Delphiの場合はTObjectを)

のdynamic_cast <>私の記憶が正しければ、RTTIに依存しています。オブジェクトがvoidポインタを通過する場合、いくつかのあいまいな外インターフェースもRTTIに依存しているかもしれません(何らかの理由でが起こるかもしれない)。

言われていること、私はプロのC ++のメンテナンス作業の10年間でtypeof演算()野生で見ていません。 (幸いにも。)

あなたは、実行時の型チェックがOKである場合のためのより効果的のC#を参照することができます。

  

項目3.特化汎用アルゴリズム   実行時の型チェックを使用して

     

あなたは簡単でジェネリックを再利用することができます   単に新しいタイプのパラメータを指定します。   新しいタイプの新しいインスタンス化   パラメータは新しいタイプが持つ意味します   同様の機能ます。

     あなたが書くので、

このすべてが、素晴らしいです   少ないコード。しかし、時々あること   より一般的な手段は取っていません   より具体的なことの利点が、   明らかに優れ、アルゴリズム。 C#の   言語規則は、このことを考慮して。   あなたが認識するためにすべてがかかっています   あなたのアルゴリズムは、より多くのことができることを   効率的な時に型パラメータ   より大きな能力を持っているし、その後に   その具体的なコードを記述します。さらに、   その二ジェネリック型を作成します   異なる制約を指定します   常に動作しません。ジェネリック   インスタンス化は、に基づいています   オブジェクトのコンパイル時の型、及び   いない実行時の型。あなたはに失敗した場合   アカウントにこれを取る、あなたが欠場することができます   可能効率ます。

たとえば、あなたがIEnumerableをによって表されるアイテムの配列に逆順列挙を提供するクラスを作成したとします。後方それを列挙するために、あなたがそれを反復処理し、リストのようなインデクサアクセスの中間コレクションに項目をコピーして、より後方インデクサアクセスを使用して、そのコレクションを列挙するために。あなたのオリジナルのIEnumerableをIListのであるなら、なぜそれを利用して後方の項目を反復するために(中間コレクションにコピーせず)よりパフォーマンスの方法を提供していません。だから、基本的にそれは我々がを活用するが、それでも(後方シーケンスを反復)と同じ動作を提供することができます。

特別です

しかし、一般的に、あなたは慎重に型チェックを時間実行し、それがリスコフSubstituion原則に違反しないことを確実に考慮すべきである。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top