傳統(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)后才能更好的使用它。