2017-03-31 7 views
1

2つのクラスがあるとします。最初のものは、第1の教師C#List <T>継承されたアイテムを追加する

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace People 
{ 
    class Teacher:Person 
    { 
     public string Position { get; set; } 
    } 
} 

であると私はリストに先生、それは私が先生を追加することも可能である方法

Teacher teacher = new Teacher() {FirstName="Peter", LastName="Janson",Position="boss" }; 
      List <Person> people= new List<Person> { }; 
      people.Add(teacher); 

を追加する人

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace People 
{ 
    class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 
} 

ですこのリストがタイプのもので、人がFirstNameとLastNameのプロパティしか持たず、 "teacher"もPositionプロパティを持っているときは、リスト内で?

+2

あなたのためにそれがより明確になりたいと考えています。 'Position'を得るためには、型を' Teacher'にキャストする必要があります。 – ThePerplexedOne

答えて

7

これは、多形性と呼ばれる基本的なオブジェクト指向の概念に関する質問です。 TeacheraPersonですが、PersonインスタンスのリストにはPersonインスタンスのリストのみが含まれていることがわかります。 Personから派生したクラスについては何も知らず、またそれは必要ありません。 y.Position:そして、あなたは教師のプロパティにアクセスすることができます

foreach (Person x in people) 
{ 
    if (x is Teacher) 
    { 
     Teacher y = (Teacher) x; 
    } 
} 

:あなたはあなたのリスト内の要素を操作している場合、あなたは自分のタイプを決定することができます

、その後、はそうのように、そのタイプににそれらをキャスト。

+4

、またはもしあなたがファンシーC#7を使っているなら 'if(x is Teacher t)' – Jonesopolis

+0

@Jonesopolisようやく! :-D – john

+1

@BRAHIMKamel - 共分散はここでは関係ありません。私は 'List 'が 'List 'に相当すると言っているわけではありません。 'b'が' a'から派生したときに 'a'に' b'を代入することは常に可能でした。分散はそれとは関係ありません。私のコード例は、.NET 4.0(2.0以降、ジェネリックが導入されたとき)より前には完璧に動作します。 –

8

前の質問に基づいて、多形性を理解する上で問題があると思います。

車と車両の関係として継承を考えてみてください。車両はベース型であり、自動車、バイク、飛行機、トラック等は派生型である。

public class Vehicle 
{ 
    public string Model {get;set;} 
} 

あなたは飛行機の格納庫を持って想像:

List<Vehicle> hangar = new List<Vehicle>(); 

、それは非常に大きいですので、あなたは飛行機の格納庫内の複数の異なる車両を駐車することができます

hangar.Add(new Plane()); 
hangar.Add(new Car()); 

彼らはさまざまなタイプだが、彼らはまだ車から継承しているので、車として保管することができます。

事は、飛行機には羽があり、車はありません。初めての車両hangar[0]を持っていれば、それは車両であることがわかります。それについての基本情報(すべての車両に共通する情報)を得ることができます:hangar[0].Modelしかし、アクセスしている車両の種類より詳細な情報が必要な場合。

if (hangar[0] is Car car) 
{ 
    string registrationNumber = car.RegistrationNumber; 
} 
else if (hangar[0] is Plane plane) 
{ 
    int numberOfWings = plane.NumberOfWings; 
} 

if (hangar[0] is Car) 
{ 
    string registrationNumber = ((Car)hangar[0]).RegistrationNumber; 
} 
else if (hangar[0] is Plane) 
{ 
    int numberOfWings = ((Plane)hangar[0]).NumberOfWings; 
} 

あなたも、この簡略化された形式を使用することができますC#7の構文を使用して:あなたは、あなたがチェックする必要があり、それがある車両の種類を知っていない可能性がありますので、今

現実の生活との類推は、ハンガーに入ると、車がどこにあるのか、そして飛行機がどこにあるのかを見なければならないということです。ここでも同じです。

多態性を使用すると、多くの派生クラスを共通ベースとして扱うことができます。あなたの人の例では、これは名前で誰かを検索できるようにしたい場合に便利です。先生は人、医者は人、彼らはすべての人、彼らはすべて名前を持っているので、そのような状況では同じものを扱うことができます。

スピードデートのように考える - あなたは行き​​、人々に会う。まず何をしますか?あなたは相手の名前を尋ねます。それからあなたは "生きていくために何をするのですか?"彼らは「私は先生です」または「私は医者です」と言います。今あなたは彼らがどんなタイプであるかを知っています。そして、あなたは彼らに "あなたは何を教えていますか?" 「あなたは何の専門分野ですか?」

私は、これは( `Person`)あなたがリストに追加することができますが、あなたが唯一の基本クラスのプロパティにアクセスできるようになります:-)

関連する問題