私は、インターフェイスIBird
を持っているとします。 eat()
,walk()
,run()
,fly()
など多くの方法があります。インターフェイスを部分的に実装するクラスをどうにかしてインスタンス化する
基本クラスOstrich
がIBird
を実装したい場合、どうすればよいでしょうか? Ostrich
は飛行することはできませんが、IBird
では他のすべてのものを行うことができます。
私は、インターフェイスIBird
を持っているとします。 eat()
,walk()
,run()
,fly()
など多くの方法があります。インターフェイスを部分的に実装するクラスをどうにかしてインスタンス化する
基本クラスOstrich
がIBird
を実装したい場合、どうすればよいでしょうか? Ostrich
は飛行することはできませんが、IBird
では他のすべてのものを行うことができます。
Ostrich
abstract
とすることができます。いくつかの状況ではうまくいくかもしれませんが、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() { ... }
}
素晴らしい!ひとつの編集だけです - オーストリッチはIBirdを実装してはいけませんか? – nit710
はい、もちろんです:) – Professor901
は、ダチョウのフライメソッド の実装で投げることができます。
class Ostrich {
void fly() {
throw new UnsupportedOperationException(); // throws the UnsupportedOperationException if someone tries to call this method
}
// implementation of eat(), walk() and run()
}
すべての鳥が飛ぶことができない場合は、fly()
はおそらくBird
内で宣言すべきではありません。
鳥と飛ぶ鳥を区別する2つのインターフェイスを導入することができます。
Bird
eat()
、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(){
...
}
}
クラスはインターフェイス全体を実装する必要があります。選択の余地ない。誰かが「ダチョウ」の飛行をしようとしている場合、あなたができる最も近いことは例外を投げることです。しかし、それは悪い習慣とみなされます。予想外のクラッシュにつながる可能性があります。 – litelite
プログラマのための主要なコミュニケーションはCODEであり、ストーリーではありません –
あなたはC#book/blogからそれを持ってきましたか? 'I'でインタフェースを開始することはjavaにとっては珍しいことです。 – Oleg