2013-08-27 48 views
2

我有一個名爲Animal的抽象類,它有大約100個方法,包括swim如何跳過擴展抽象類的類中的一個方法?

許多類,如狗,貓,獅子正在擴展該類。

現在有一隻動物長頸鹿不會游泳。但它正在擴展Animal抽象類。

我想那個長頸鹿對象沒有swim方法。

Giraffe g = new Giraffe(); 
//g.swim(); // This swim should not come. 

我不能改變動物類。 一個解決方案是創建一個更復雜的類,複製除游泳以外的所有方法。 但這不是一個好方法。

我如何使用Animal抽象類來做到這一點? 提前致謝。

+0

爲什麼不使用Swimable,Barkable等接口並實現它。 –

+4

問題是你在'Animal'中有一個糟糕的設計,因爲你說動物可以游泳..長頸鹿是一種動物,不會游泳.. – nachokk

回答

2

您不能通過合同導致java指南。如果你說Animal可以游泳,那麼所有的動物都可以游泳,包括長頸鹿,如果不是,那麼長頸鹿就不是動物。

你能做的唯一的事情是在不改變動物

@Override 
public void swim(){ 
throw new UnsupportedOperationException(); 
} 

你可以做的另一件事是讓另一個類

public class Giraffe { 

private final Animal a; 

public Giraffe(Animal a){ 
    this.a=a; 
} 

public void method1(){ 
    a.method1(); 
} 

public Something drink(){ 
    return a.drink(); 
} 
. 
. 
. 
// and not implementing swim 
} 

另一個是使一個超級接口,動物,唐」沒有swim()方法,並讓Animal實現它。

0

您不能跳過swim()的定義。但是,您可以爲這種情況拋出異常。

void swim() throws CanNotSwimException{ 
} 
+0

@OP它可能不是你想要的樣子,但它絕對沒有錯或關閉的話題。 – rocketboy

0

在我看來,最優雅的解決方案是要覆蓋的方法,並拋出一個OperationNotSupportedException

-1

根據不同的情況,你也可以只保留方法的空白,如果是void