参考記事:のhttp://www.cftea.com/c/2012/03/5522.asp;ます。http://blog.sina.com.cn/s/blog_4aaeba510100c4y6.html
抽象メソッド:メリット:柔軟な実装コードの再利用、サブクラスのオーバーライド(上書き);私は達成するために私のクラスを継承することによってそれを達成することはできません抽象目的
1を、抽象クラスのメソッドは抽象メソッド、またはエラーでなければならない;
B、性質がする必要はありません抽象プロパティ。
2、クラスが抽象クラスを継承することができ、
B、抽象とプライベート、仮想、静的は、同時に使用することができない;
Cは、抽象クラスをインスタンス化することができません。
図3に示すように、抽象クラスの抽象メソッド、書き換えるべき抽象プロパティ一般サブクラス(一貫したアクセシビリティオーバーライドされる)、及びリードの抽象的性質と一致するようにケースを書きます。
図4に示すように、抽象クラスの抽象メソッドが抽象特性を抽象サブクラスをオーバーライドする必要はないが、実装するために書き換える必要があり、書き換えに実装されていないサブクラスでオーバーライドしなければなりません。
図5に示すように、サブクラスは、抽象クラスが継承された抽象クラスが再びメソッドプロパティを継承オーバーライドでき継承します。
6、ではない抽象フィールド(フィールドのみ等号、プロパティ異なるない他のコード()、何も抽象的感覚によって割り当てることができるため)。
例:
パブリック 抽象 クラス PhoneAbsstract // 抽象クラスのメソッドは抽象メソッド、またはエラーでなければなりません。プロパティは、抽象プロパティにはありません。 { 公共の 抽象 ボイドコール(); パブリック 抽象 ボイドカメラ(); パブリック 抽象 ボイドインターネット(); プライベート int型 _size = 0 ; 公共 int型のサイズは { GET { 戻り}; _size SET {_size = サイズ;} } パブリック 抽象の int型の重量を{ GET;} } パブリック クラス PHONE1:PhoneAbsstract // 抽象クラスの抽象メソッド、抽象性は、一般的に、リードのサブクラス(一貫したアクセシビリティオーバーライドされる)、および抽象的特性を書き換えると一致するようにケースを記述することができます。 { 公共 オーバーライド ボイドコール() { Console.Writeは(「私は呼び出すことができます。」); } パブリック・ オーバーライド・ ボイドカメラ() { Console.Write(「私は写真を再生することができます。」); } 公共 オーバーライド 無効インターネット() { Console.Write(「私はアクセスすることができます。」); } プライベート INT _weight = 0 ; 公共 オーバーライド INTの重量{ GET { 戻り_weight;} } } パブリック 抽象 クラスは IPhoneAbstract:PhoneAbsstract // 抽象クラスの抽象メソッド、抽象属性サブクラスで抽象を書き換える必要はありません、しかし、実装する必要があります書き換え { 公共 オーバーライド ボイドコール() { Console.Write(「IPhone携帯電話を呼び出すことができます。」); } 公共 オーバーライド 無効インターネットを()//サブクラスは、抽象クラスが継承された抽象クラスが再びメソッドのプロパティを継承しオーバーライドすることができます継承します。 { Console.Write(" IPhoneモバイルインターネット。" ); } プライベート INT _weight = 0 ; 公共 オーバーライド INTの重量 { GET { 戻り_weight;} } } パブリック クラス iphone1を:IPhoneAbstractは// そのサブクラスにオーバーライドされません達成するために書き換える必要があります { 公共 オーバーライド 無効インターネット() { Console.Write(「インターネットへのIPhone携帯電話のアクセスを。」); } パブリック オーバーライド ボイド写真() { Console.Write(" IPhone缶カメラ付き携帯電話。" ); } }
第二に、インターフェース:マルチステート;目的は、人々が遵守するための標準インタフェースを提供することですが、我々が達成する方法がわからない;(マルチステートを使用して)シンプルなファクトリパターンの応用;
1、インターフェースは唯一のインターフェイスは、公開でなければならない実装し、公開とすることができます。
図2は、複数のインタフェースを実装することができるが、全ての方法継承インターフェイスが達成されなければならない。
例:単純な工場パターン
クラスプログラム { 静的 ボイドメイン(文字列[]引数) { phone2のP2 = 新しい新しいphone2の(); カメラC = 新しい新しいカメラ(); SimplenessFactoryカメラ(P2);. SimplenessFactoryカメラ(C);. Console.Read(); } } パブリック クラス SimplenessFactory // 単純な工学モデル・アプリケーション・インターフェース { 公共 静的 ボイドカメラ(撮影装置インターフェース写真) { フォトカメラ(); } } パブリック インターフェース呼び出しインターフェース// インターフェイスのみ公共 { ボイドコール(); } パブリック インターフェース撮影装置インターフェース { ボイドカメラ(); int型のサイズ{ GET ;} } パブリック インターフェイスアクセスインターフェース { ボイドインターネット(); } パブリック クラス phone1は:コール・インタフェース// インタフェースの実装クラスは、パブリックでなければなりません { 公共 のボイド)の呼び出しを(// パブリックでなければなりません { Console.WriteLineを(" 電話1つのコール。" ); } } パブリック クラス phone2の:デバイスインタフェース呼び出し、カメラ・デバイス・インターフェース、アクセス装置インタフェース// 複数のインターフェイスを実装することができるが、継承されたインタフェースを実装しなければならないすべてのメソッド { 公共 ボイドコール() { Console.WriteLineをします(" 電話2。" ); } 公共 ボイド写真() { Console.WriteLineを(" カメラ付き携帯電話2。" ); } 公共 ボイドインターネット() { Console.WriteLineを(" インターネットの電話2。" ); } 公共 int型のサイズ{ GET { 返す 100 ;} } // 属性はパブリックである必要があり、実装しなければならない } パブリック クラスのカメラ:カメラインタフェース { 公共 空写真() { Console.WriteLineを(「カメラのカメラ。」); } 公共 int型のサイズ { GET { 返し 200がある;} } // 属性は、パブリックでなければなりません、実装しなければなりません }
第三に、抽象クラスとインタフェースとの間の差:
1、クラスは複数のインタフェースであるが、唯一の抽象クラスを実装することができます。
2、抽象クラスの具体的な方法は、仮想デフォルトを実装していますが、インタフェースクラスメソッドの実装のインタフェースは、非仮想デフォルト、もちろん、あなたが仮想宣言することができている
類似の非抽象クラス、抽象クラスで(インターフェイス)、3また、このクラスの基底クラスのリストに記載されているインタフェースのすべてのメンバーのための独自の実装を提供する必要があります。しかし、抽象クラスインターフェースの方法が可能
抽象メソッドにマッピングされました。
4、良好な界面定義はインターフェイスまたは原因の汚染、特定の機能ではなく、多機能であるべきです。
第四に、抽象クラスとインタフェースの使用:
1.コンポーネントの複数のバージョンを作成することが予想される場合は、抽象クラスを作成します。抽象クラスは、コンポーネントのバージョンを制御するための簡単な方法を提供します。
機能が異なるオブジェクト間の広い範囲で使用されるように作成された場合2.インタフェースを使用。あなたは小さく、簡潔な機能ブロックを設計したい場合は、インタフェースを使用しています。
3.機能部を大きく設計する場合、抽象クラスが使用されている。抽象クラスを使用して、達成された機能を達成するために、すべてのコンポーネントに共通を提供します。
4.メイン抽象近いオブジェクトのクラス、およびインタフェースは、クラスとは無関係の一般的な機能を提供するように適合されています。
ここで私は、インターネット上で見るものである少数のメタファー、本当に良い、ハァッ:
1.航空機は、彼らが同じインターフェイス「飛ぶ」を継承している、鳥が飛ぶ、飛ぶことができる。しかし、抽象クラスに属するF22の航空機は、抽象クラスの鳩は鳥に属します。
(マルチ状態)鉄の門の扉のように2ドア(抽象クラス)、あなたは私が(インスタンス化することはできません)与えることはできませんドアをしたいですが、私はあなたの特定の門やドアを与えることができ、かつ唯一可能ドア、あなたはそれが窓(単一継承)であると言うことはできません。ドアをロックすることができます(インターフェース)も(実現よりも多く)ドアベルすることができます。ドア(抽象クラス)はインターフェース(ロック)あなたが何ができるかを設定します(最高1インタフェースはただ一つのことだけを行うことができ、あなたはロックバー(インターフェイス汚染)を鳴らすことができます求めることはできません、あなたが何であるかを定義します。