2017-08-11 13 views
0

私は、インターフェイスIBirdを持っているとします。 eat(),walk(),run(),fly()など多くの方法があります。インターフェイスを部分的に実装するクラスをどうにかしてインスタンス化する

基本クラスOstrichIBirdを実装したい場合、どうすればよいでしょうか? Ostrichは飛行することはできませんが、IBirdでは他のすべてのものを行うことができます。

+2

クラスはインターフェイス全体を実装する必要があります。選択の余地ない。誰かが「ダチョウ」の飛行をしようとしている場合、あなたができる最も近いことは例外を投げることです。しかし、それは悪い習慣とみなされます。予想外のクラッシュにつながる可能性があります。 – litelite

+0

プログラマのための主要なコミュニケーションはCODEであり、ストーリーではありません –

+0

あなたはC#book/blogからそれを持ってきましたか? 'I'でインタフェースを開始することはjavaにとっては珍しいことです。 – Oleg

答えて

5

Ostrichabstractとすることができます。いくつかの状況ではうまくいくかもしれませんが、Ostrichのすべてのインスタンスが欠落した機能を実装する必要があるため、ここでは機能しません。

もう1つの選択肢は、Johnyが指摘され、UnsupportedOperationExceptionを投げることです。しかし、それは予期せぬクラッシュを引き起こし、ユーザーには不都合なものになる可能性があります。

第三の方法は、界面IBirdから方法fly()を削除のみ全て鳥が共有するものを残すことです。次に、IBirdを拡張する別のインターフェイスIBirdThatCanFlyを作成します。次に、不足しているfly()メソッドを追加できます。

public interface IBird { //all birds 
    public void eat(); 
    public void walk(); 
    public void run(); 
} 

public interface IBirdThatCanFly extends IBird { //birds that can fly 
    public void fly(); 
} 

public class Ostrich implements IBird { //Ostrich can't fly 
    public void eat() { ... } 
    public void walk() { ... } 
    public void run() { ... } 
} 
+0

素晴らしい!ひとつの編集だけです - オーストリッチはIBirdを実装してはいけませんか? – nit710

+0

はい、もちろんです:) – Professor901

1

は、ダチョウのフライメソッド の実装で投げることができます。

class Ostrich { 

    void fly() { 
     throw new UnsupportedOperationException(); // throws the UnsupportedOperationException if someone tries to call this method 
    } 

    // implementation of eat(), walk() and run() 

} 
-1

Java 8を使用している場合は、インターフェイスでdefaultキーワードを使用することもできます。これにより、クラスがメソッドを実装していない場合に使用するメソッドを書き出すことができます。

+2

あなたがそうするなら、あなたは飛行するダチョウで終わることができます。 – Oleg

+0

これは単なる回避策なので、OPはメソッドをクラスに入れる必要はありません。私はそれがちょうどいい選択肢だったとは決して言いませんでした。 – dblanken

0

すべての鳥が飛ぶことができない場合は、fly()はおそらくBird内で宣言すべきではありません。
鳥と飛ぶ鳥を区別する2つのインターフェイスを導入することができます。

Birdeat()walk()run()のメソッドが宣言されているインターフェイス。
を拡張し、fly()メソッドを宣言するインターフェイスのFlyingBirdインターフェイス。

public interface Bird { 
    void eat(); 
    void walk(); 
    void run(); 
} 

public interface FlyingBird extends Bird { 
    void fly(); 
} 

public class Ostrich implements Bird { 
    public void eat(){ 
     ... 
    } 
    public void walk(){ 
     ... 
    } 
    public void run(){ 
     ... 
    } 
} 
関連する問題