2017-03-31 37 views
1

假設我們有2個類。第一個是人C#列表<T>添加繼承物品

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; } 
    } 
} 

第二個是教師

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); 

這怎麼可能,我想補充的老師在列表中,當這個列表是類型和人員只有名字和姓氏屬性和「老師」也有位置屬性?

+2

您可以將它們添加到列表中,但你只能夠訪問基類的屬性('Person')。爲了獲得'位置',你必須將類型轉換爲'Teacher'。 – ThePerplexedOne

回答

7

這是一個關於基本面向對象的概念稱爲多態性的問題。 A Teacher a Person,但是您的Person實例列表只知道它包含一個Person實例的列表;它不知道從Person派生的類,也不需要。

如果你在你的列表中的元素時,可以判斷其類型,然後他們入式,像這樣:

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

然後你就可以訪問教師的屬性:y.Position

+4

或'如果(x是老師t)'如果您使用花哨的C#7 – Jonesopolis

+0

@Jonesopolis最後! :-D – john

+1

@BRAHIMKamel - 協方差在這裏不相關。我不是說'List '相當於'List '。當'b'從'a'派生出來時,總是可以用'b'代替'a' ...方差與它無關。我的代碼示例在.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) 
{ 
    string registrationNumber = ((Car)hangar[0]).RegistrationNumber; 
} 
else if (hangar[0] is Plane) 
{ 
    int numberOfWings = ((Plane)hangar[0]).NumberOfWings; 
} 

使用C#7語法,你也可以使用這種簡單的形式:

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

與現實生活的類比是,如果你進入機庫,你必須看看汽車在哪裏,飛機在哪裏。這裏也一樣。

多態性可讓您將許多派生類視爲它們的公共基礎。在你的人的例子中,如果你想能夠通過名字搜索某人,這將是有用的。老師是一個人,一個醫生是一個人,他們都是人,他們都有名字,所以在這種情況下,你可以對待他們一樣。

認爲它就像速度約會 - 你去和你見面的人。你先做什麼?你問對方的名字。然後你問:「你以什麼爲生?」他們說「我是老師」或「我是醫生」。現在你知道他們是什麼類型,你可以問他們「你在教什麼?」或者「你專注於哪種醫學分支?」

我希望這是更清楚你:-)