これら2つの割り当ての違いは何ですか? A は Base から継承します。
Base b = new A();
A c = new A();
2番目がタイプAとして宣言されている場合、これが機能する理由がわかりません。
List<Base> vals = new List<Base>();
values.Add(b);
values.Add(c);
これをさらに理解するには、何を調べればよいですか?
これら2つの割り当ての違いは何ですか? A は Base から継承します。
Base b = new A();
A c = new A();
2番目がタイプAとして宣言されている場合、これが機能する理由がわかりません。
List<Base> vals = new List<Base>();
values.Add(b);
values.Add(c);
これをさらに理解するには、何を調べればよいですか?
継承は is a関係を構成します: A
inheritsの場合、 は許可されている場所ならどこにでも移動できることBase
を意味します。これはまさにコード スニペットが示しているものです。 のインスタンス、 のサブクラスを のサブクラスが移動できる場所に追加できます。A
Base
A
Base
List<Base>
Base
これは、継承が推移的であるためです。MSDNが言うように:
ClassC が ClassB から派生し、ClassB が ClassA から派生した場合、ClassC は ClassB および ClassA で宣言されたメンバーを継承します。
したがって、あなたの場合、 からA
継承するためBase
、A
「is-a」Base
であるため、 a に追加できますList<Base>
。そのリストのすべての要素は になりますBase
。
2つのステートメントは私には明らかです。最初の例では、1つの特殊化のようにインスタンス化されているプリミティブオブジェクトBaseがあるためです。そして2つ目では、Aは独自のタイプのようにインスタンス化されています。覚えておかなければならないのは、Aタイプもベースタイプであるということです。この機能はポリモーフィズムと呼ばれます。あなたはhttp://en.wikipedia.org/wiki/Polymorphism_in_object-Oriented_programmingでもっと何かを読むことができます
継承に関するこれらの質問は、C# および実際にはすべてのオブジェクト指向言語の基本です。Pro C# 5.0 and the .NET 4.5 Framework, Sixth Editionまたは、 Microsoft C# チュートリアル などの無料のオンライン チュートリアル や、こちらのc#などの優れた本から始める必要があり ます。www.pluralsight.com を参照してください。約 30 ドル / 月で、専門家による素晴らしいビデオがいくつかあります。月額 50 ドルでエクササイズをダウンロードできます。
質問に戻ります。AとBを入れ替えてみよう
//Base Class A is Animal. Class B might be a Bird.
Animal A = new bird(); // but A has visibility of or can access the features common to all animals Ie access a bird but with a narrower view.
Bird C = new Bird() ; works for the obvious reason.
but thats just the beginning...
抽象クラスと仮想クラスおよびプロパティを考慮する必要があります。プロパティのオーバーライド。そして、あなたの例にはリストがあるので、COVARIANCE の質問に出くわすことさえあります。
実際には、深いところにジャンプします... http://msdn.microsoft.com/en-us/vstudio/ee672314 共分散と反分散。味見するだけです。
最近 (過去 12 か月) に c# を学んだので、本気なら、上記のような本やビデオ コースを読むことをお勧めします。検索すると、C# の質問に関する多くの情報が見つかります。
あなたが何気ない興味を持っているなら、私は何を提案すればよいかわかりません.
C を vals に追加すると、コンパイラは自動的に C を OOP の Base にキャストします -> 子から親にキャストします => 問題ありません
Base b = new A();
A は Base を実装しているため、これは有効です。
b は、Base のプロパティとメソッドのみを持ちます。
ただし、違いは、b を A にキャストしてから、A のプロパティとメソッドを使用できることです。