很多人在初次接觸設計模式的時候,最大的疑惑莫過於碰到這樣的句子:(父類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,結果就完全不一樣),有人把這叫做“關注對象原則”。
·向上轉型是一定沒有錯的,就好比你說“狗是動物”是成立的,反之,向下轉型就要注意了,你不能說“動物是狗”。
也不知道說明白沒有,先下了。。。