2012-09-10 145 views
3

我的問題是:我可以創建一個擴展另一個類的類,但選擇不繼承某個特定的方法嗎?擴展類不能繼承一個方法嗎?

一個簡單的例子,我有一個抽象的鳥類與一個方法,fly()。我想爲不同種類的鳥類創建類,但企鵝不能飛。我如何確保企鵝對象不能調用fly()方法?

+0

覆蓋企鵝類fly(),並使其拋出「我是磚」異常? –

+0

我認爲你需要有另一個類的子集(另一個分類級別),你的設計需要改變。無論你問的是什麼,都不能馬上完成。 – kosa

+1

查看LSP。 – SLaks

回答

9

不,你不能

你可以得到最接近的是要覆蓋的方法,並拋出

@Override 
public void fly() { 
    throw new UnsuportedOperationException(); 
} 

Java的API做到這一點,但有時我個人認爲這是糟糕的設計。

你可以做的是有一個Bird和兩個子類FlyableBird和NonFlyableBird的層次結構,然後讓企鵝掛掉NonFlyableBird。 fly方法只能在FlyableBird類中。鳥類仍可含)之類的東西makeNoise((所有的鳥發出噪音不他們?),這是共同的FlyableBird和NonFlyableBird

+0

謝謝你的迴應。我曾想過如何進一步細分課程,如果有更簡單的方法,這似乎是一件麻煩事。看來我該學習如何拋出異常了。 – MrDetail

+0

@MrDetail UnsupportedOperationException是一個運行時異常。查看已檢查和未檢查的異常之間的區別。它會影響您的代碼,在相當大的方式 – RNJ

+0

@RNJ通過'UnsuportedOperationException'我們需要覆蓋'飛()''上NonFlyableBirds'。根據@ MrDetail的問題,他希望確保一個企鵝對象不能調用'fly()'方法。但設計建議調用會拋出'UnsuportedOperationException'。我認爲還需要爲NonFlyableBirds調用fly,然後編寫一些邏輯來避免飛行行爲。 –

1

如果你需要做你正在做的事情,那麼你有錯誤的類/概念層次結構。重新設計你的課程。

2

你不能。但是,你可以在企鵝的fly()方法中扔出UnsupportedOperationException

+3

你應該使用UnsupportedOperationException –

3

不,你不能從根本上打破多態。你必須實現這個功能,並執行諸如拋出異常或什麼都不做的事情。

0

重寫fly方法,以指向另一個操作或返回而不執行該操作。

0

你可以聲明的方法fly爲abstract method,但如果你不提供你會被迫宣稱Penguin類也是抽象的,我認爲這不是你想要的,因爲企鵝不應該是抽象的,它沒有任何意義。

0

您可以創建一個名爲Fly的界面。那麼擴展Bird可以飛行的每個具體類都應該實現這個接口。企鵝不會實現這個,所以你的企鵝對象引用永遠不會飛。

2

您需要有非常好的設計來實現您提到的場景。你需要有如下設計。

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(); 
} 
} 
0

我認爲,你可以創建一個主抽象類鳥抽象的方法,如飛行,步行等 然後你就可以說鳥類的兩個子類。 FlyingBirds和NonFlyingBirds.In非飛鳥具體類,你可以使飛行方法成爲final。所以這個方法不會繼承到子類。