抽象クラスは、単なるコントラクトではなく実際のクラスであることを除けば、インターフェースと同じものです。インターフェイスがコントラクトと呼ばれるのはなぜですか?
2 に答える
インターフェイスと抽象クラスはどちらも、バインドするため、コントラクトです。
しかし、インターフェースと抽象クラスの間には他にも違いがあります。
あなたが言ったように、関数へのコンテンツまたはデフォルト値を持つ実際のデータメンバー、または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.
{
.........
}
抽象クラスはインターフェースと同じものです。真実ではありません。インターフェイスは、メソッド本体、プライベートメソッド、静的フィールド/メソッドなどを定義しません。
抽象メソッドはプライベートメソッドである可能性があるため、外部からのアクセスが保証されません。インターフェイスの実装では、インターフェイスのメソッドを公開する必要があり、そのため、そのようなメソッドの存在とアクセス可能性が「保証」されます。したがって、契約という用語が使用されます。