私はasp.netプログラマーです。抽象クラスとインターフェースの記事を読みましたが、それを実装する方法も知っています.しかし、抽象クラスを使用する場所とインターフェースを使用する場所のプロジェクトシナリオを参照して、実際に説明できますか?
プロジェクトで非常に効率的に実装できるように、非常に実用的または実際のプロジェクトの例が必要ですか?
ありがとうございます。
すぐに実用的な例を示すことはできませんが、両方の基本的な違いを小さな例で説明しましょう。
抽象クラスは、クラスの階層構造の一部です。つまり、それらは継承に使用されます。インターフェイスは継承とは何の関係もありません。抽象クラスは、インスタンス化できないことを意味し、すべてのメンバー(フィールド、メソッド、およびコンストラクター)はサブクラスによって継承されます。インターフェイスは、実装するメソッドのみを定義できます。
意味のある階層構造を持つ抽象クラスを使用する必要があります。
実際の車とボートのみをインスタンス化する場合は、 Aをとvehicle
の抽象クラスにすることができます。車両は フィールドを持つことができ、それはその後継承されます。インターフェイスはこのフィールドを定義できません。car
boat
maximumSpeed
メソッドのみが必要な場合は、インターフェースを使用する必要があります。これらの車両と相互作用する(「それらを運転する」)プログラムを作成しているが、これらのオブジェクトの状態を気にしない場合、プログラムが知らないうちにすべてのボートと車を運転できるようにvehicle
、メソッドを使用してインターフェースを定義できます。drive()
彼らが本当に何であるか。
最後に、クラスは複数のインターフェースを実装できます。違いを示すもう1つの例として、実際のオブジェクトを想像できる場合は、オブジェクトとどのように相互作用するかを考えてください。コーヒーメーカーを想定すると、オン/オフボタンがあります。「抽象的なコーヒーマシン」は実際には意味がありません。知っておく必要があるのは、setOn()
andsetOff()
メソッドがあるということだけです。
プロジェクトの例はドメインに依存するため、例を理解するにはまずドメインを理解する必要があるため、料理の例で要約します。
パスタをさまざまなソースで調理できるようにしたいとします。ソース コードでソースとは別にパスタを扱いたいとします。最初のアプローチは、Cook メソッドを使用してインターフェイス IPasta を定義することです。
public interface IPasta
{
void Cook();
}
クライアントコードは、パスタの実装とは独立してパスタを調理できます: トマトソース、ペストソース? あなたはそれに名前を付けます、私たちはそれを調理できます:
...
IPasta pasta = GetPasta();
pasta.Cook();
...
しかし、よく考えてみると、パスタを調理するプロセスは、ソースを準備するポイントを除いて、常に同じプロセスであることがわかります。
これは、ソースとは独立して実装できるパスタの基本アルゴリズムがあることを意味します。水を沸騰させ、ソースを準備し、パスタを鍋から取り出し、ソースと混ぜ合わせます。
public abstract class Pasta
{
public void Cook()
{
BoilWater();
PrepareSauce();
...
}
protected abstract void PrepareSauce();
private void BoilWater()
{
// Boil some water
}
}
public class PastaWithPestoSauce
{
protected override void PrepareSauce()
{
// Prepare pesto sauce
}
}
クライアントは次のように使用します。
...
Pasta pasta = GetPasta();
pasta.Cook();
...
したがって、C# の意味ではなく、よく知られているパブリックな動作 (抽象クラスのパブリック メソッド Cook) の一般的な意味でのインターフェイスはまだありますが、一部のコードを節約することもできました。
オブジェクトが何であるかに関係なく、オブジェクトの特性または能力を定義する必要がある場合、私は個人的にインターフェイスを使用するのが好きです。
「実生活」の例では、Person と Mones (私のニックネーム:D) という 2 つのクラスと、IGuitarPlayer という 1 つのインターフェイスがあることがわかります。そのため、Mones は Person を継承し、Mones にギターを弾く能力がある場合は、IGuitarPlayer インターフェイスを実装します。