2012-03-02 11 views

答えて

12

構造体は、スタック内(またはどこにいるかにかかわらず)に固定サイズのスロットを占有します。

したがって、派生した構造体のサイズが異なるため、構造体で多態性を行うことはできません。

メンバーを他の構造体から継承することは可能ですが、あなたはいかなる種類のポリンプライスも行うことができないので、混乱する価値はありません。 .NETで

+4

これは、構造体から継承したときに、すべてのメソッド、プロパティ、およびフィールドのコピーを持っていることになりますが、テンプレート構文を排除するものではありません。割り当て互換性はありませんが、「子孫」に追加した追加のものと同じレイアウトになります。私は事実は十分だと思うが、混乱するだろう。 –

+4

2つの単語:オブジェクトのスライス。 http://en.wikipedia.org/wiki/Object_slicing –

+2

@ LasseV.Karlsen:まさに。サポートされていれば、この質問は「なぜBase b = new Derived()を書くことができないのですか? – SLaks

1

、クラスAタイプBから継承及びタイプAのオブジェクトがタイプBのオブジェクトを期待するコードに渡された場合、渡されるオブジェクトは、Bに変換されないであろうが、Aのままであろう。これは、すべてのオブジェクトに型記述子への参照が格納されているために可能です。クラスには型記述子が格納されていません。 A型の構造体が、B型の構造体を期待するルーチンに渡すことができた場合、は、Bという構造体になります。それが賢明である場合は、AからBまでの拡大変換演算子を定義する方が現実的です。

タイプAの構造体をルーチンexpecting type Bに渡すと便利な場合があります。変換演算子はそこでは助けません。ただし、構造体型AにはBのフィールドだけが含まれているため、やや面倒ではありますが、これを処理できます。そのフィールドは、次に参照するタイプBルーチンに渡すことができます。難しいのは、任意のフィールドへのアクセスに内部構造体の名前を含める必要があるということです。

構造体だけでなくクラスについても、「拡張型」という概念が役立ちます。すべてのクラスは、継承可能であろうとなかろうと、インスタンスメンバのみを含む拡張型で拡張できます。拡張型の変数または値は、基本型の実行時オブジェクトとみなされ、拡張型とその基本型の間、または同じ基本型から派生した拡張型の間のすべての変換は「拡大」とみなされ、 no-opsとして処理されます。拡張タイプの唯一の効果は、そのタイプに対して定義されたスコープメンバーをもたらすことです。これらは、拡張タイプとして宣言された変数と変数にのみ適用され、拡張タイプのメンバーは基本クラスメンバーよりも優先されるという点を除いて、拡張メソッドとよく似た動作をします。そのようなものの多くの用途を想像することができます(クラスのいくつかのインスタンスで拡張メソッドを使用したいが、すべてのインスタンスで拡張メソッドを使用したくない場合など)。特徴。

関連する問題