看完抽象類的時候,感覺這個不錯,只要在父類中寫乙個方法體,在子類中要引用的時候,直接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
, animal always has legs
",type);}}
class
dog : animal
, dog has four legs
", type);}}
class
glede : animal
, glede has two legs
",type);}}
class
test
}結果:
this
isan animal , animal always has legs
this
isa dog , dog has four legs
this
isa glede , glede has two legs
真正明白了這些,也就該接觸設計模式領域了。
最後嘮叨兩句:
·因為a2,a3都是子類的物件,所以呼叫起來,也都是呼叫的子類的方法(當然前提是它們都override了父類方法,諸位可以試著把兩個子類中的override替換成new,結果就完全不一樣),有人把這叫做「關注物件原則」。
·向上轉型是一定沒有錯的,就好比你說「狗是動物」是成立的,反之,向下轉型就要注意了,你不能說「動物是狗」。
也不知道說明白沒有,先下了。。。
C 抽象類和介面的比較
相同點 都不能被直接例項化,都可以通過繼承實現其抽象方法。都是面向抽象程式設計的技術基礎,實現了諸多的設計模式。不同點 介面支援多繼承 抽象類不能實現多繼承。介面只能定義抽象規則 抽象類既可以定義規則,還可能提供已實現的成員。介面是一組行為規範 抽象類是乙個不完全的類,著重族的概念。介面可以用於支援...
C 抽象類和介面的區別
net提供了介面,這個不同於class或者struct的型別定義。介面有些情況,看似和抽象類一樣,因此有些人認為在.net可以完全用介面來替換抽象類。其實不然,介面和抽象類各有長處和缺陷,因此往往在應用當中,兩者要結合來使用,從而互補長短。接下來先說說抽象類和介面的區別。區別一,兩者表達的概念不一樣...
C 抽象類和介面的區別
純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中定義純虛函式的方法 virtual returntype function 0 帶有純虛函式的類稱為抽象類。抽象類是一種特殊的類,它是為了抽象和設計的目的而建立的,它處於繼承層次結構的較上層,抽象類是...