嚴格來說,多態與繼承、重載并不是孤立的,他們之間存在著緊密的聯系,多態是建立在這兩者的基礎之上的(實際上繼承就有用重載這一特性)。
傳統的多態實際上就是由虛函數(Virtual Function)利用虛表(Virtual Table)實現的(早期C模擬OO特性時使用最多,C++的實現也是,后來的技術未作研究,是否使用VT不得而知),自然是離不開繼承,換句話說多態實際上覆蓋了繼承。
正是由于繼承與多態的緊密聯系,使得我們很容易張冠李戴,那么如何區別呢?
舉個常用的例子:
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;
}
}
那么這種類的關系叫做繼承,下面這種使用方式也是繼承所帶來的:
Triangel tri = new Triangle();
println("Triangle is a type of sharp? " + tri.isSharp());
而這種方式則是多態:
Sharp sharp = new Rectangle();
println("My sharp has " + sharp.getSides() + " sides.");
這兩者區別在哪?很顯然,繼承是子類使用父類的方法,而多態則是父類使用子類的方法。
其技術上的區別是綁定時期,晚期綁定一定是多態。
多態有時候也被稱為動態綁定或者晚綁定或運行時綁定,意思是編譯的時候不必關心,運行的時候才決定調用哪個對象的哪個方法
這里介紹區別并不是想說茴字有幾種寫法,而是只有清楚的認識到技術的顯著特點后才能更好的使用它。