インターフェースと抽象クラスの違いは何ですか? 質問する

インターフェースと抽象クラスの違いは何ですか? 質問する

インターフェースと抽象クラスの違いは正確には何でしょうか?

ベストアンサー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__ メソッド) が混在しています。

プログラミングではいつものことですが、理論、実践、そして別の言語での実践があります :-)

おすすめ記事