2012-05-10 5 views
0

私はasp.net programmer.iです抽象クラスとインターフェイスの記事を読んでいると私はそれを実装する方法を知っている。しかし、誰も実際には、プロジェクトのシナリオを参照して抽象クラスとインターフェイスを使用する場所を参照して私を説明することができますか?Abstactクラスとインターフェイスの使用場所

私はプロジェクトで非常に効率的に実装できるように、非常に実用的な、または実際のプロジェクトの例が必要ですか?

ありがとうございました。

+0

可能な複製[抽象クラスの代わりにインターフェイスを使用する場合と逆の場合](http://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an) -abstract-class-and-vice-versa) –

答えて

0

私はあなたに実用的な例で、すぐを与えるが、私は小さな例で両方の物事の間の基本的な違いを説明させないことができます。

抽象クラスは、クラスの階層構造の一部です。つまり、彼らは継承のために使われます。インタフェースは継承とは何の関係もありません。抽象クラスはインスタンス化できないことを意味し、すべてのメンバー(フィールドメソッドコンストラクタ)はサブクラスによって継承されます。インタフェースは、メソッドを実装することのみを定義できます。

あなたは理にかなって階層構造を持つ抽象クラスを使用する必要があります:あなたが唯一の実際の車やボートがインスタンス化されるようにする場合

vehicleは、carboatに抽象クラスすることができます。車両にはmaximumSpeedフィールドがあり、継承されます。インターフェイスはこのフィールドを定義できません。

は、メソッドが必要な場合のみインターフェイスを使用する必要があります。 がこれらの車両とと相互作用する( "ドライブする")プログラムを作成していますが、これらのオブジェクトの状態を気にしない場合は、drive()というインターフェイスを持つvehicleインターフェイスを定義して、ボートや車、彼らが本当に何を知ることなく。

最後に、クラスは複数のインターフェイスを実装できます。違いを示すもう1つの例は、あなたが実生活であなたのオブジェクトを描くことができれば、それをどのようにやりとりするかを考えることです。コーヒーメーカーには、オン/オフボタンがあります。 「抽象的なコーヒーマシン」は本当に意味をなさない。あなたが知る必要があるのは、setOn()setOff()メソッドがあることです。

+1

コーヒーマシンについて話している:http://www.objectmentor.com/resources/articles/CoffeeMaker.pdf –

+0

初心者プログラマーのための素敵な読書:) – MarioDS

0

私は、オブジェクトが何であるかにかかわらずオブジェクトの特性や能力を定義する必要があるときに、私は個人的にインターフェイスを使いたいと思っています。

「実生活」の例では、PersonとMones(私のニックネーム名:D)と1つのインターフェースIGuitarPlayerの2つのクラスがあります。 したがって、MonesはPersonから継承し、Monesがギターを弾く能力を持っている場合、IGuitarPlayerインターフェイスを実装します。

0

プロジェクトの例はドメインに依存しています。例を理解するためにまず理解しなければならないことは、調理例で抽象化します。

さまざまなソースでパスタを作ることができるとします。ソースコードとは別にパスタを処理したいとします。最初のアプローチは、メソッド・クックとのインタフェース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#の意味ではなく、よく知られている公共の行動(パブリックメソッドクックの一般的な意味では、インターフェースを持っています抽象クラスの)、しかし我々はまた、いくつかのコードを余分に管理しました。

関連する問題