interface
とabstract function
はかなり似ているように思えますが、
あるメソッドを実装しなければならないという命令のようなものです。
違いは何ですか?
interface
とabstract function
はかなり似ているように思えますが、
あるメソッドを実装しなければならないという命令のようなものです。
違いは何ですか?
引用:(e-satisによる非常に良い説明)
インターフェース
インターフェースはコントラクトです: インターフェースを書いている人は「ねえ、私はそのように見えるものを受け入れます」と言い、インターフェースを使用している人は「OK、私が書いたクラスはそのように見えます」と言います.
インターフェイスは空のシェルであり、メソッドのシグネチャ (名前 / パラメーター / 戻り値の型) のみがあります。メソッドには何も含まれていません。インターフェイスは何もできません。それはただのパターンです。
EG (疑似コード):
// I say all motor vehicles should look like that :
interface MotorVehicle
{
void run();
int getFuel();
}
// my team mate complies and write vehicle looking that way
class Car implements MotoVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
インターフェイスの実装は、CPU をほとんど消費しません。これは、クラスではなく名前の集まりにすぎないため、高価な検索を行う必要がないためです。組み込みデバイスなど、重要な場合に最適です。
抽象クラス
インターフェースとは異なり、抽象クラスはクラスです。それらから継承するときに行うルックアップがあるため、使用するコストが高くなります。
抽象クラスはインターフェイスによく似ていますが、それ以上のものがあります。それらの動作を定義できます。それは、「これらのクラスはそのように見えるべきであり、共通点があるので、空白を埋めてください!」と言っている人のことです。
例えば:
// I say all motor vehicles should look like that :
abstract class MotorVehicle
{
int fuel;
// they ALL have fuel, so why let others implement that ?
// let's make it for everybody
int getFuel()
{
return this.fuel;
}
// that can be very different, force them to provide their
// implementation
abstract void run();
}
// my team mate complies and write vehicle looking that way
class Car extends MotorVehicule
{
void run()
{
print("Wrroooooooom");
}
}
多重継承のない言語では、この違いは非常に重要です。PHP または Java の用語では、クラスは複数のインターフェースを実装する場合がありますが、継承できるのは単一の親クラス (abstract である可能性がある) からのみです。
たとえば、c++ では、この区別はそれほど重要ではなくなります。