我有兩個abstract班級FlyingBird和RunningBird
public abstract FlyingBird extends Bird implements IFlyingBird {}
public abstract RunningBird extends Bird implements IRunningBird {}
現在我想要另一個抽象類,它既是IRunningBird又IFlyingBird
public abstract FlyingRunningBird extends Bird implements IFlyingBird, IRunningBird {}
在這個類中,我復制了所有代碼,FlyingBird并且RunningBird
依賴類的聚合是不可能的,因為這兩個類都是抽象的
問題是,如果任何錯誤修復或修改在其中一個上完成FlyingBird或RunningBird不會反映在FlyingRunningBird. 我也需要更新FlyingRunningBird。
有什么我們可以避免這種代碼重復的FlyingRunningBird嗎?還是
使用FlyingBirdand RunningBirdinFlyingRunningBird來避免代碼重復?
uj5u.com熱心網友回復:
Java 的設計考慮了 C 中的多重繼承問題。所以只有單繼承和多介面。當時在 C 中,可能屬于兩個父類的方法存在歧義。
為了實作您的目標,解決方案是使用委托:
- 指定介面
- 指定實作
- 代表
使用其他常規命名:
public interface Flying {
void fly();
double getWingSpan();
}
public class FlyingImplementation implements Flying {
public FlyingImplementation(Bird bird)
...
}
public interface Running {
void run();
double getRunningSpeed();
}
public class RunningImplementation implements Running {
public RunningImplementation(Bird bird) {}
...
}
public abstract FlyingRunningBird implements Flying, Running, Bird {
private final Flying birdFlying;
private final Running birdRunning;
protected FlyingRunningBird() {
birdFlying = new FlyingImplementation(this);
birdRunning = new RunningImplementation(this);
}
@Override
public void fly() {
birdFlying.fly();
}
@Override
void run() {
birdRunning.run();
}
...
}
中的常見事物Bird,也可以有一個基類。Flying并且Running是能力,名稱形容詞,唯一責任:飛行。跑步。
委派birdFlying并明確birdRunning“多重繼承”,而且表現力絲毫不減。
uj5u.com熱心網友回復:
我認為有兩種方法可以解決這個問題:
- 將方法實作作為
default相應的方法移動interface,假設您使用的是 Java 8 ,并且這些方法不需要訪問欄位(在這種情況下,您需要在介面中有一些訪問器或重新考慮您的設計)。 - 優先考慮組合而不是繼承,盡管在這種特殊情況下這似乎不太自然。即,
FlyingRunningBird可以為您提供一個實體FlyingBird和一個實體RunningBird(在構造時),它將簡單地將每個介面的方法呼叫委托給相應的實作。
uj5u.com熱心網友回復:
在您的情況下,您可以使用不屬于層次結構中任何位置但具有通用代碼以避免重復的 Helper 類 -> 類。
否則,從 OO 的角度來看——
- FlyingRunningBird 的飛行方式可能與 FlyingBird 不同。
- FlyingRunningBird 的飛行方式可能與 RunningBird 不同
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/407839.html
標籤:
上一篇:無法從簡單類結構中的錯誤轉換
