讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議41:讓多重繼承成為現實 >

建議41:讓多重繼承成為現實

在Java中一個類可以多重實現,但不能多重繼承,也就是說一個類能夠同時實現多個接口,但不能同時繼承多個類。但有時候我們確實需要繼承多個類,比如希望擁有兩個類的行為功能,就很難使用單繼承來解決問題了(當然,使用多層繼承是可以解決的)。幸運的是Java中提供的內部類可以曲折地解決此問題,我們來看一個案例,定義一個父親、母親接口,描述父親強壯、母親溫柔的理想情形,代碼如下:


//父親

interface Father{

public int strong();

}

//母親

interface Mother{

public int kind();

}


其中strong和kind的返回值表示強壯和溫柔的指數,指數越高強壯度和溫柔度也就越高,這與在遊戲中設置人物的屬性值是一樣的。我們繼續來看父親、母親這兩個實現:


class FatherImpl implements Father{

//父親的強壯指數是8

public int strong(){

return 8;

}

}

class MotherImpl implements Mother{

//母親的溫柔指數是8

public int kind(){

return 8;

}

}


父親強壯指數是8,母親溫柔指數也是8,門當戶對,那他們生的兒子、女兒一定更優秀了,我們先來看兒子類,代碼如下:


class Son extends FatherImpl implements Mother{

@Override

public int strong(){

//兒子比父親強壯

return super.strong()+1;

}

@Override

public int kind(){

return new MotherSpecial().kind();

}

private class MotherSpecial extends MotherImpl{

public int kind(){

//兒子溫柔指數降低了

return super.kind()-1;

}

}

}


兒子繼承自父親,變得比父親更強壯了(覆寫父類strong方法),同時兒子也具有母親的優點,只是溫柔指數降低了。注意看,這裡構造了MotherSpecial類繼承母親類,也就是獲得了母親類的行為方法,這也是內部類的一個重要特性:內部類可以繼承一個與外部類無關的類,保證了內部類的獨立性,正是基於這一點,多重繼承才會成為可能。MotherSpecial的這種內部類叫做成員內部類(也叫做實例內部類,Instance Inner Class)。我們再來看看女兒類,代碼如下:


class Daughter extends MotherImpl implements Father{

@Override

public int strong(){

return new FatherImpl(){

@Override

public int strong(){

//女兒的強壯指數降低了

return super.strong()-2;

}

}.strong();

}

}


女兒繼承了母親的溫柔指數,同時又覆寫父類的強壯指數,不多解釋。注意看覆寫的strong方法,這裡是創建了一個匿名內部類(Anonymous Inner Class)來覆寫父類的方法,以完成繼承父親行為的功能。

多重繼承指的是一個類可以同時從多於一個的父類那裡繼承行為與特徵,按照這個定義來看,我們的兒子類、女兒類都實現了從父親類、母親類那裡所繼承的功能,應該屬於多重繼承。這要完全歸功於內部類,諸位在需要用到多重繼承時,可以思考一下內部類。

在現實生活中,也確實存在多重繼承的問題,上面的例子是說後人即繼承了父親也繼承了母親的行為和特徵,再比如我國的特產動物「四不像」(學名麋鹿),其外形「似鹿非鹿,似馬非馬,似牛非牛,似驢非驢」,這你要是想用單繼承表示就麻煩了,如果用多繼承則可以很好地解決問題:定義鹿、馬、牛、驢四個類,然後建立麋鹿類的多個內部類,繼承它們即可。