0

抽象クラスは、単なるコントラクトではなく実際のクラスであることを除けば、インターフェースと同じものです。インターフェイスがコントラクトと呼ばれるのはなぜですか?

4

2 に答える 2

1

インターフェイスと抽象クラスはどちらも、バインドするため、コントラクトです。

しかし、インターフェースと抽象クラスの間には他にも違いがあります。

あなたが言ったように、関数へのコンテンツまたはデフォルト値を持つ実際のデータメンバー、またはctorを含む実際のクラスが必要な場合は、明らかに抽象クラスが必要になります。

しかし、多くの場合、インターフェースまたは抽象クラスのどちらを選択するかは技術的に同じです。そして、時には長期的にも同じになるでしょう。

その場合、あなたの決定はあなたが探しているものの性質に基づくべきです。

それはあなたのデータ型に余分な文字ですか?それとも、データ型が何であるかを定義しますか?

実例を考えてみましたが、何年も何もしていないので見つからなかったので、本のような例をあげましょう。

抽象クラスAnimalがあるとします。

public abstract class Animal
{
    abstract string Name;
    abstract bool IsWild;
    abstract bool IsHappy;
}

これは簡単にインターフェースであった可能性があります。

また、インターフェイスとして選択しても、実際にはデザインに悪影響を与えることはありません。

しかし、その性質上、動物でclass Dog あるため、抽象クラスである必要があります。class Dog : Animalではなくする必要がありますclass Dog : IAnimal

動物であることはの余分な性格ではありませんDog。それを定義するものです。

そして、すべての動物がからのみ継承するように制限する必要がありますAnimal

IAnimal誰かに他の何かを継承させます。お気に入り:

public class Dog : Food, IAnimal {}

興味深いことに、同じことをするためだけに、何も持たない抽象クラスを作成する場合があります。

たとえば、共通のプロパティがない場合Animalでも、次のようにします。

public abstract class Animal { }

public class Dog : Animal // No actual added value.
{ 
        .........
}
于 2012-08-19T13:55:20.973 に答える
0

抽象クラスはインターフェースと同じものです。真実ではありません。インターフェイスは、メソッド本体、プライベートメソッド、静的フィールド/メソッドなどを定義しません。

抽象メソッドはプライベートメソッドである可能性があるため、外部からのアクセスが保証されません。インターフェイスの実装では、インターフェイスのメソッドを公開する必要があり、そのため、そのようなメソッドの存在とアクセス可能性が「保証」されます。したがって、契約という用語が使用されます。

于 2012-08-19T13:43:59.300 に答える