なぜインターフェース??????
それは犬から始まります。特にパグ。
パグにはさまざまな動作があります。
public class Pug {
private String name;
public Pug(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Arf!"; }
public boolean hasCurlyTail() { return true; } }
そして、あなたには一連の行動をするラブラドールがいます。
public class Lab {
private String name;
public Lab(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Woof!"; }
public boolean hasCurlyTail() { return false; } }
私たちはいくつかのパグとラボを作ることができます:
Pug pug = new Pug("Spot");
Lab lab = new Lab("Fido");
そして、それらの動作を呼び出すことができます:
pug.bark() -> "Arf!"
lab.bark() -> "Woof!"
pug.hasCurlyTail() -> true
lab.hasCurlyTail() -> false
pug.getName() -> "Spot"
犬小屋を経営していて、飼っているすべての犬を追跡する必要があるとします。私は別々の配列で私のパグとラブラドールを保存する必要があります:
public class Kennel {
Pug[] pugs = new Pug[10];
Lab[] labs = new Lab[10];
public void addPug(Pug p) { ... }
public void addLab(Lab l) { ... }
public void printDogs() { // Display names of all the dogs } }
しかし、これは明らかに最適ではありません。いくつかのプードルも収納したい場合は、犬舎の定義を変更してプードルの配列を追加する必要があります。実際、犬の種類ごとに個別の配列が必要です。
洞察:パグとラブラドール(およびプードル)はどちらも犬の一種であり、同じ動作セットを持っています。つまり、(この例の目的で)すべての犬は吠え、名前を付けることができ、巻き毛の尾がある場合とない場合があると言えます。すべての犬ができることを定義するためにインターフェースを使用できますが、それらの特定の動作を実装するために特定のタイプの犬に任せます。インターフェースは「すべての犬ができることはここにある」と述べていますが、それぞれの行動がどのように行われるかについては述べていません。
public interface Dog
{
public String bark();
public String getName();
public boolean hasCurlyTail(); }
次に、PugクラスとLabクラスを少し変更して、Dogの動作を実装します。パグは犬で、ラボは犬であると言えます。
public class Pug implements Dog {
// the rest is the same as before }
public class Lab implements Dog {
// the rest is the same as before
}
以前と同じようにPugsとLabsをインスタンス化することもできますが、今ではそれを実行する新しい方法も利用できます。
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
これは、d1は犬だけではなく、具体的にはパグであることを示しています。また、d2も犬、特にラボです。ビヘイビアーを呼び出すことができ、ビヘイビアーは以前と同様に機能します。
d1.bark() -> "Arf!"
d2.bark() -> "Woof!"
d1.hasCurlyTail() -> true
d2.hasCurlyTail() -> false
d1.getName() -> "Spot"
ここですべての余分な作業が報われます。Kennelクラスがはるかに単純になります。1つの配列と1つのaddDogメソッドだけが必要です。どちらも犬であるオブジェクトで動作します。つまり、Dogインターフェースを実装するオブジェクトです。
public class Kennel {
Dog[] dogs = new Dog[20];
public void addDog(Dog d) { ... }
public void printDogs() {
// Display names of all the dogs } }
使用方法は次のとおりです。
Kennel k = new Kennel();
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
k.addDog(d1);
k.addDog(d2);
k.printDogs();
最後のステートメントは次のように表示されます:Spot Fido
インターフェイスを使用すると、インターフェイスを実装するすべてのクラスが共有する一連の動作を指定できます。その結果、変数やコレクション(配列など)を定義することができます。これらは、インターフェイスを実装するオブジェクトを保持するだけで、それらが保持する特定のオブジェクトの種類を事前に知る必要はありません。