インターフェイスと抽象クラスの違いは何ですか?
インターフェイスは 契約 です。インターフェイスを書いている人は「ヘイ、私はそのように見えるものを受け入れます」と言い、インターフェイスを使っている人は「OK、私が書いたクラスはそのように見えます」と言います。
インターフェイスは空っぽの殻です。メソッドのシグネチャがあるだけで、メソッドはボディを持っていないことを意味しています。インターフェイスは何もできません。単なるパターンに過ぎません。
例えば(疑似コード)。
// 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モジュールから得られるプログラミングのコツであり、実際にはメタクラス、つまりクラスを使っています。そして、インターフェースは、この言語のダックタイピングに関連しており、規約と記述子を呼び出す特別なメソッド(\メソッド)が混在しています。
プログラミングの常として、理論があり、実践があり、そして別の言語での実践がある :-)
抽象クラスとは、次のようなクラスのことです。 プログラマーによって部分的にしか実装されていない プログラマーが部分的にしか実装しないクラスです。1つまたは複数の抽象メソッドを含むことができます。 抽象メソッドを含むことができます。抽象メソッド 抽象メソッドとは、単なる関数の定義です。 プログラマーに、そのメソッドは メソッドは子クラスで実装しなければならないことを クラスで実装しなければならないことをプログラマに伝える役割を果たします。
インターフェイスは、抽象クラスに似ています。 クラスのようなもので、実際、インターフェースはクラスや抽象クラスと クラスや抽象クラスと同じ名前空間を占めています。 クラスと同じ名前空間を占めています。そのため、同じ名前のインターフェ > イスを定義することはできません。 クラスと同じ名前のインターフェイスを定義することは クラスと同じ名前のインターフェイスを定義することはできません。インターフェイスは完全な抽象クラスです。 抽象クラスで、そのメソッドは一切実装されません。 実装されておらず、クラスがサブクラス化するのではなく クラスをサブクラス化するのではなく、そのインターフェ > イスを実装するといいます。 そのインターフェイスを実装するといいます。
いずれにしても、私はこのインターフェイスの説明はやや分かりにくいと思います。より一般的な定義は以下の通りです。*インターフェイスは、実装クラスが満たさなければならない契約を定義します。インターフェイスの定義は、実装コードを伴わないパブリックメンバーのシグネチャで構成されています。
本来の質問の答えではありませんが、両者の違いの答えがわかると、いつそれぞれを使うかというジレンマに陥ることになります。 https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both
私はOOPの知識は乏しいのですが、インターフェースを文法における形容詞に相当するものと見なすことで、今まではうまくいっていました(この方法がインチキだったら訂正してください!)。例えば、インターフェイスの名前は、クラスに与えることのできる属性や機能のようなもので、1つのクラスは多くのインターフェイスを持つことができます。ISerializable, ICountable, IList, ICacheable, IHappy, ...。