継承
車とバスを考えてみましょう。彼らは2つの異なる車両です。しかし、それでも、ステアリング、ブレーキ、ギア、エンジンなどのように、いくつかの共通のプロパティを共有しています。
したがって、継承の概念では、これは次のように表すことができます...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
今自転車...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
そして車...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
これが継承のすべてです。上記で見たように、これらを使用してオブジェクトをより単純なBaseフォームとその子に分類します。
抽象クラス
抽象クラスは不完全なオブジェクトです。さらに理解するために、車両のアナロジーをもう一度考えてみましょう。
車両を運転することができます。正しい?しかし、さまざまな車両がさまざまな方法で運転されます...たとえば、自転車を運転するように車を運転することはできません。
それでは、車両の駆動機能をどのように表すのでしょうか?車両の種類を確認して独自の機能で運転することは困難です。新しいタイプの車両を追加するときは、Driverクラスを何度も変更する必要があります。
抽象クラスとメソッドの役割がここに来ます。継承するすべての子がこの関数を実装する必要があることを伝えるために、driveメソッドを抽象として定義できます。
したがって、車両クラスを変更すると...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
自転車と車はまた、それを運転する方法を指定する必要があります。そうしないと、コードはコンパイルされず、エラーがスローされます。
つまり、抽象クラスは一部の不完全なクラスであり、いくつかの不完全な関数があり、継承する子はそれを指定する必要があります。
インターフェース
インターフェースは完全に不完全です。プロパティはありません。彼らは単に、継承する子供たちが何かを
することができることを示します... あなたがあなたと一緒に異なるタイプの携帯電話を持っていると仮定します。それぞれに異なる機能を実行するための異なる方法があります。例:人を呼び出す。電話のメーカーはそれを行う方法を指定します。ここで、携帯電話は番号をダイヤルできます-つまり、ダイヤル可能です。これをインターフェースとして表現しましょう。
public interface Dialable {
public void dial(Number n);
}
ここで、Dialableのメーカーは、番号をダイヤルする方法を定義します。ダイヤルする番号を指定するだけです。
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
これにより、抽象クラスの代わりにインターフェースを使用することで、Dialableを使用する関数の作成者は、そのプロパティについて心配する必要がありません。例:タッチスクリーンまたはダイヤルパッドはありますか、固定電話または携帯電話ですか。それがダイヤル可能かどうかを知る必要があるだけです。Dialableインターフェイスを継承(または実装)しますか?
そしてもっと重要なことは、いつかあなたが別のものとDialableを切り替えるなら
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
ダイヤラブルを使用する関数は、ダイヤラブルインターフェイスで指定された詳細以外の詳細に依存しない(およびできない)ため、コードが完全に機能することを確認できます。どちらもDialableインターフェースを実装しており、それが関数が気にする唯一のものです。
インターフェースは、共通の機能を共有する限り(オブジェクトを固定電話や携帯電話に変更する場合と同じように、番号をダイヤルする必要がある限り)、オブジェクト間の相互運用性(互換的に使用)を保証するために開発者によって一般的に使用されます。つまり、インターフェイスは、プロパティのない抽象クラスのはるかに単純なバージョンです。
また、必要な数のインターフェイスを実装(継承)できますが、拡張(継承)できるのは単一の親クラスのみです。
詳細
抽象クラスとインターフェイス