看完抽象類別的時候,感覺這個不錯,只要在父類中寫一個方法體,在子類中要引用的時候,直接override就可以。在學完介面後,感覺到介面在這方面更好,因為在C#中,類都是單根繼承的,如果有多個方法,要重寫的時候,那引用介面多好啊,後面增加的時候也方便。
當看到person p=new son()這個的時候,感覺有點奇怪,因為開始看的時候都是person p=new person(),或者son s=new son()的,那person p=new son()(父類引用指向子類的對象).到底有什麼好處呢,如果子類中覆蓋了父類中的方法,則調用子類中的方法,否則調用父類的方法。以下是引用來自的“滴d” 部落格的內容。
關於父類引用指向子類對象
很多人在初次接觸設計模式的時候,最大的疑惑莫過於碰到這樣的句子:(父類Animal和子類Dog)
Animal a2 = new Dog();
這是什麼玩意兒?究竟有什麼用途,我直接用子類對象不就完了?
我們就來解釋一下:
--這是什麼玩意兒?
re:這種用法叫做“父類引用指向子類對象”(跟繞口令似的),或者叫“父類指標指向子類對象”,指的是定義一個父類的引用,而它實際指向的是子類建立的對象。功能上相當於子類的“向上轉型”,或者“上溯對象”,
上面的語句也可以寫成:
Animal a2 = new Animal();
Dog dog = new Dog();
a2 = dog;
將子類對象賦給父類的引用就是向上轉型,Animal a2 = new Dog();中的new Dog()就是執行個體化一個沒有名字的對象,然後轉型給父類的引用a2,僅此而已。
--究竟有什麼用途?
re:一般來說,一個對象執行個體建立完就定死了,比如dog,如果程式裡的變數寫dog的話,萬一以後發生變化就要改代碼了。那麼事先就不寫死dog,而是寫父類Animal,那麼以後用到Animal的地方,用dog執行個體,cat執行個體都可以取代,不用改執行個體名了。說玄乎一點,也就體現了物件導向“多態”的特性。
下面看一個很簡單的例子,就更加明白了:
class Animal
{
private String type = "Animal";
public virtual void showLegs()
{
Console.WriteLine("This is an {0} , Animal always has legs",type);
}
}
class Dog : Animal
{
private String type = "Dog";
public override void showLegs()
{
Console.WriteLine("This is a {0} , Dog has four legs", type);
}
}
class Glede : Animal
{
private String type = "Glede";
public override void showLegs()
{
Console.WriteLine("This is a {0} , Glede has two legs",type);
}
}
class test
{
static void Main(string[] args)
{
Animal a1 = new Animal();
Animal a2 = new Dog();
Animal a3 = new Glede();
a1.showLegs();
a2.showLegs();
a3.showLegs();
Console.ReadLine();
}
}
結果:
This is an Animal , Animal always has legs
This is a Dog , Dog has four legs
This is a Glede , Glede has two legs
真正明白了這些,也就該接觸設計模式領域了。
最後嘮叨兩句:
·因為a2,a3都是子類的對象,所以調用起來,也都是調用的子類的方法(當然前提是它們都override了父類方法,諸位可以試著把兩個子類中的override替換成new,結果就完全不一樣),有人把這叫做“關注對象原則”。
·向上轉型是一定沒有錯的,就好比你說“狗是動物”是成立的,反之,向下轉型就要注意了,你不能說“動物是狗”。
也不知道說明白沒有,先下了。。。