這是一個祖先/後代關係的實例化。
class Dog : Anima{}
class Cat : Animal{}
Animal dog = new Dog(); //Correct
Animal cat=new Cat(); //Correct
Dog d=cat; //Incorrect
每隻狗都是動物,每隻貓都是動物,但不是每隻動物都可以是狗或貓。
但是你可以投你的基礎對象引用子類型,如果是同一類型:
Dog d=(Dog)dog;
而且,繼承「是-A」樣的關係也被稱爲推廣。這意味着繼承類是「祖先類」,但不一定是反過來,即「狗」是「動物」,但不一定是相反的。
您還可以看到下面的例子:
class Animal{}
class Dog : Animal {}
class Labrador : Dog{}
class Husky : Dog{}
現在,如果我說,我有一隻狗,我會稱他爲動物,這將永遠是正確的。事實上,我有一隻哈士奇,我可以把它稱爲一隻總是正確的狗或動物。 但是,如果我說,我有一隻狗,我會稱他爲拉布拉多犬,可能不正確。如果我有赫斯基怎麼辦?
編輯:只是給你一個真實世界的例子。
class Person
{
string Name{ get; set; }
}
class Employee : Person
{
string Id{ get; set; }
}
現在,我可以這樣做:
Person p = new Employee();
Console.WriteLine("Name is: {0}", p.Name);
但我可以做的:
Employee e = new Person();
Console.WriteLine("Employee Id is: {0}", e.Id);
上面的語句將是有缺陷的COS對象是類型的人,並沒有屬性Id,儘管引用是Employee類型的。
但我仍然可以這樣做:
Person p = new Employee();
Console.WriteLine("Name is: {0}", p.Name);
Console.WriteLine("Id is: {0}", ((Employee)p).Id);
上述類型轉換是可能的,因爲refernce即,p型是人的,但實際的固有目的是Employee類型。
請注意,在進行類型轉換時,編譯器只在編譯時檢查繼承關係,而不檢查實際類型。實際類型在運行時檢查。例如。
class Teacher:Person
{}
現在,如果你做到以下幾點:
Person p = new Teacher();
Employee e = (Employee)p;
上面的代碼不會產生編譯器警告,但會在運行時失敗。
'Epos'不是'Epos2'。 – SLaks
每隻狗都是動物'動物a =新的狗();'但不是每個動物都是狗'狗d =新動物()' –
受保護的構造函數意味着你只能生成一個基類的子類 – Decoy