嚴(yán)格來說,多態(tài)與繼承、重載并不是孤立的,他們之間存在著緊密的聯(lián)系,多態(tài)是建立在這兩者的基礎(chǔ)之上的(實(shí)際上繼承就有用重載這一特性)。


  傳統(tǒng)的多態(tài)實(shí)際上就是由虛函數(shù)(Virtual Function)利用虛表(Virtual Table)實(shí)現(xiàn)的(早期C模擬OO特性時(shí)使用最多,C++的實(shí)現(xiàn)也是,后來的技術(shù)未作研究,是否使用VT不得而知),自然是離不開繼承,換句話說多態(tài)實(shí)際上覆蓋了繼承。

  正是由于繼承與多態(tài)的緊密聯(lián)系,使得我們很容易張冠李戴,那么如何區(qū)別呢?

  舉個(gè)常用的例子:

Abstract Class Sharp implement IHaveSide {
 public bool isSharp(){
   return true;
 }
 public abstract int getSides();
}

Class Triangle extends Sharp {
 public override int getSides() {
   return 3;
 }
}

Class Rectangle extends Sharp {
 pubilc override int getSides() {
  return 4;
 }
}

那么這種類的關(guān)系叫做繼承,下面這種使用方式也是繼承所帶來的:
Triangel tri = new Triangle();
println("Triangle is a type of sharp? " + tri.isSharp());

而這種方式則是多態(tài):
Sharp sharp = new Rectangle();
println("My sharp has " + sharp.getSides() + " sides.");

這兩者區(qū)別在哪?很顯然,繼承是子類使用父類的方法,而多態(tài)則是父類使用子類的方法。

其技術(shù)上的區(qū)別是綁定時(shí)期,晚期綁定一定是多態(tài)。

多態(tài)有時(shí)候也被稱為動(dòng)態(tài)綁定或者晚綁定或運(yùn)行時(shí)綁定,意思是編譯的時(shí)候不必關(guān)心,運(yùn)行的時(shí)候才決定調(diào)用哪個(gè)對(duì)象的哪個(gè)方法

這里介紹區(qū)別并不是想說茴字有幾種寫法,而是只有清楚的認(rèn)識(shí)到技術(shù)的顯著特點(diǎn)后才能更好的使用它。