1. ホーム
  2. oop

[解決済み] インターフェースと抽象クラスの違いは何ですか?

2022-03-14 07:46:13

質問

インターフェースと抽象クラスは具体的にどう違うのですか?

どのように解決するのですか?

インターフェイス

インターフェースは 契約 : インターフェイスを書く人は、" おいおい、そういう風に見えるのは受け入れるよ "と言い、インターフェースを使う人は ".と言う。 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;
    }
}

なぜなら、クラスではなく、単に名前の束なので、高価なルックアップを行う必要がないからです。組み込み機器など、重要な場合に最適です。


抽象クラス

抽象クラスは、インターフェースとは異なり、クラスです。継承する際にルックアップが必要なため、利用するにはコストがかかります。

抽象クラスはインターフェースとよく似ていますが、それ以上のものを持っています。抽象クラスの振る舞いを定義することができるのです。どちらかというと、人が言う、" これらのクラスは、そのように見えるはずで、その共通点を持っているので、空白を埋めてください! ということです。

例えば

// 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__メソッド)の間に混在しているのです。

プログラミングの常として、理論があり、実践があり、別の言語での実践がある :-)