インターフェースと抽象クラスの違いは正確には何でしょうか?
ベストアンサー1
インターフェース
インターフェースは契約です。インターフェースを書く人は「ああ、そのように見えるものを受け入れます」と言い、インターフェースを使用する人は「わかりました。私が書いたクラスはそのように見えます」と言います。
インターフェースは空のシェルです。メソッドのシグネチャのみがあり、メソッドには本体がないことを意味します。インターフェースは何もできません。単なるパターンです。
たとえば(疑似コード):
// I say all motor vehicles should look like this:
interface MotorVehicle
{
void run();
int getFuel();
}
// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
インターフェイスの実装はクラスではなく単なる名前の集まりなので、CPU の消費量は非常に少なく、コストのかかる検索も必要ありません。組み込みデバイスなど、重要な用途では最適です。
抽象クラス
抽象クラスは、インターフェースとは異なり、クラスです。抽象クラスを継承するときに検索を行う必要があるため、使用コストが高くなります。
抽象クラスはインターフェースによく似ていますが、それ以上の機能があります。つまり、抽象クラスの動作を定義できるのです。つまり、人が「これらのクラスはこのような形であるべきで、共通点があるので、空欄を埋めてください!」と言うようなものです。
例えば:
// I say all motor vehicles should look like this:
abstract class MotorVehicle
{
int fuel;
// They ALL have fuel, so lets implement this for everybody.
int getFuel()
{
return this.fuel;
}
// That can be very different, force them to provide their
// own implementation.
abstract void run();
}
// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
void run()
{
print("Wrroooooooom");
}
}
実装
抽象クラスとインターフェースは異なる概念であるはずですが、実装によってその記述が真実でなくなることがあります。ときには、それらがあなたが考えているものと異なることもあります。
Java ではこのルールが厳格に適用されますが、PHP ではインターフェースはメソッドが宣言されていない抽象クラスです。
Python では、抽象クラスは ABC モジュールから取得できるプログラミング トリックであり、実際にはメタクラス、つまりクラスを使用しています。また、インターフェイスは、この言語のダック タイピングに関連しており、規約と記述子を呼び出す特別なメソッド (__method__ メソッド) が混在しています。
プログラミングではいつものことですが、理論、実践、そして別の言語での実践があります :-)