我的問題是:我可以創建一個擴展另一個類的類,但選擇不繼承某個特定的方法嗎?擴展類不能繼承一個方法嗎?
一個簡單的例子,我有一個抽象的鳥類與一個方法,fly()。我想爲不同種類的鳥類創建類,但企鵝不能飛。我如何確保企鵝對象不能調用fly()方法?
我的問題是:我可以創建一個擴展另一個類的類,但選擇不繼承某個特定的方法嗎?擴展類不能繼承一個方法嗎?
一個簡單的例子,我有一個抽象的鳥類與一個方法,fly()。我想爲不同種類的鳥類創建類,但企鵝不能飛。我如何確保企鵝對象不能調用fly()方法?
不,你不能
你可以得到最接近的是要覆蓋的方法,並拋出
@Override
public void fly() {
throw new UnsuportedOperationException();
}
Java的API做到這一點,但有時我個人認爲這是糟糕的設計。
你可以做的是有一個Bird和兩個子類FlyableBird和NonFlyableBird的層次結構,然後讓企鵝掛掉NonFlyableBird。 fly方法只能在FlyableBird類中。鳥類仍可含)之類的東西makeNoise((所有的鳥發出噪音不他們?),這是共同的FlyableBird和NonFlyableBird
謝謝你的迴應。我曾想過如何進一步細分課程,如果有更簡單的方法,這似乎是一件麻煩事。看來我該學習如何拋出異常了。 – MrDetail
@MrDetail UnsupportedOperationException是一個運行時異常。查看已檢查和未檢查的異常之間的區別。它會影響您的代碼,在相當大的方式 – RNJ
@RNJ通過'UnsuportedOperationException'我們需要覆蓋'飛()''上NonFlyableBirds'。根據@ MrDetail的問題,他希望確保一個企鵝對象不能調用'fly()'方法。但設計建議調用會拋出'UnsuportedOperationException'。我認爲還需要爲NonFlyableBirds調用fly,然後編寫一些邏輯來避免飛行行爲。 –
如果你需要做你正在做的事情,那麼你有錯誤的類/概念層次結構。重新設計你的課程。
你不能。但是,你可以在企鵝的fly()
方法中扔出UnsupportedOperationException
。
你應該使用UnsupportedOperationException –
不,你不能從根本上打破多態。你必須實現這個功能,並執行諸如拋出異常或什麼都不做的事情。
重寫fly方法,以指向另一個操作或返回而不執行該操作。
你可以聲明的方法fly爲abstract method,但如果你不提供你會被迫宣稱Penguin類也是抽象的,我認爲這不是你想要的,因爲企鵝不應該是抽象的,它沒有任何意義。
您可以創建一個名爲Fly的界面。那麼擴展Bird可以飛行的每個具體類都應該實現這個接口。企鵝不會實現這個,所以你的企鵝對象引用永遠不會飛。
您需要有非常好的設計來實現您提到的場景。你需要有如下設計。
public abstract class Bird {
FlyBehavior flyBehavior;
public Bird(){
}
public void performFly(){
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
}
public interface FlyBehavior {
public void fly();
}
public class FlyingBirds implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can fly");
}
}
public class NonFlyingBirds implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am not able to fly");
}
}
public class KingFisher extends Bird {
public KingFisher(){
flyBehavior = new FlyingBirds();
}
public static void main(String[] args) {
Bird bird = new KingFisher();
bird.performFly();
}
}
public class Penguins extends Bird {
public Penguins(){
flyBehavior = new NonFlyingBirds();
}
public static void main(String[] args) {
Bird bird = new Penguins();
bird.performFly();
}
}
我認爲,你可以創建一個主抽象類鳥抽象的方法,如飛行,步行等 然後你就可以說鳥類的兩個子類。 FlyingBirds和NonFlyingBirds.In非飛鳥具體類,你可以使飛行方法成爲final。所以這個方法不會繼承到子類。
覆蓋企鵝類fly(),並使其拋出「我是磚」異常? –
我認爲你需要有另一個類的子集(另一個分類級別),你的設計需要改變。無論你問的是什麼,都不能馬上完成。 – kosa
查看LSP。 – SLaks