抽象クラスと虚メソッドの総括虚メソッド(virtualとabstract)

8911 ワード

抽象クラス定義:その役割は、サブクラスを生成し、サブクラスに特定の属性と方法を与えることです.abstract修飾子は、クラス、メソッド、プロパティ、インデックス、およびイベントとともに使用できます.クラス宣言でabstract修飾子を使用して、クラスが他のクラスのベースクラスのみであることを示します.抽象クラスまたは抽象クラスに含まれるメンバーとしてマークするには、抽象クラスから派生したクラスによって実現する必要があります.プロパティ:1.抽象クラスはインスタンス化できません.2.抽象クラスは抽象メソッドと抽象アクセサを含むことができる.3.sealed修飾子で抽象クラスを変更することはできません.これは抽象クラスが継承されないことを意味します.4.抽象クラスから派生する飛抽象クラスは、継承されたすべての抽象メソッドと抽象アクセスの実装を含む必要があります.まとめ:~抽象的な方法は暗黙的な虚の方法である;~抽象クラスで抽象メソッド宣言を使用することのみを許可します.~抽象メソッド宣言は実際の実装を提供しないため、メソッド体はありません.メソッド宣言は1つのセミコロンで終了し、署名後にカッコ「{}」がなく、非抽象クラスのメンバーである重メソッドによって提供されることを実現する.~抽象メソッド宣言でstaticまたはvirtual修飾子を使用するのはエラーです.~宣言と呼び出しの構文が異なるほか、抽象属性の動作は抽象方法と同じである.~静的プロパティでabsteact修飾子を使用するのはエラーです.
~派生クラスではoverride修飾子を用いた属性宣言を含めることで抽象的な継承属性を書き換えることができる. 

  
  
  
  
  1. using System; 
  2. abstract class A 
  3.     public abstract void F(); 
  4.     protected int _x; 
  5.     public abstract int X 
  6.     { 
  7.         get
  8.         set
  9.     } 
  10. class B:A 
  11.     public override void F() 
  12.     { 
  13.          
  14.     } 
  15.     public override int X 
  16.     { 
  17.         get{return _x;} 
  18.         set{_x=value;} 
  19.     } 
  20. class Test 
  21.     static void Main() 
  22.     { 
  23.         B b=new B(); 
  24.         b.X=10; 
  25.         Console.Write(b.X); 
  26.     } 


虚メソッド定義:簡単に言えば、虚メソッドはクラスに書き換える方法であり、サブクラスが虚メソッドを書き換えると、実行時に書き換えた論理が使用され、書き換えがなければ親クラスの虚メソッドの論理が使用される.virtualキーワードは、メソッド、プロパティ、インデックス、またはイベント宣言を修飾し、派生クラスでこれらのオブジェクトを書き換えることができます. 

  
  
  
  
  1. using   System   ;   
  2.     
  3.   class   A   
  4.     
  5.   {   
  6.     
  7.   public   void   F(   )   
  8.   {    
  9.       Console.WriteLine("A.F")   ;   
  10.   } 
  11.     
  12.   public   virtual   void   G(   )   
  13.   {   
  14.       Console.WriteLine("A.G")   ;    
  15.   } 
  16.     
  17.   }   
  18.     
  19.   class   B:   A   
  20.     
  21.   {   
  22.     
  23.   new   public   void   F(   )   
  24.   {    
  25.       Console.WriteLine("B.F")   ;   
  26.   } 
  27.     
  28.   public   override   void   G(   )   
  29.   {    
  30.       Console.WriteLine("B.G")   ;  
  31.   } 
  32.     
  33.   }   
  34.     
  35.   class   Test   
  36.     
  37.   {   
  38.     
  39.   static   void   Main(   )     
  40.     
  41.   {   
  42.   B   b   =   new   B(   )   ;   
  43.     
  44.   A   a   =   b;   
  45.     
  46.   a.F(   )   ;   
  47.     
  48.   b.F(   )   ;   
  49.     
  50.   a.G(   )   ;   
  51.     
  52.   b.G(   )   ;   
  53.     
  54.   }   
  55.     
  56.   }   
  :A.F   B.F  B.G  B.G

実は最も重要なのは抽象的な方法がインスタンス化できないことであり,サブクラスが強制的にそれを上書きしなければならない方法である.一方,虚メソッドは,上書きしなくてもよい選択を提供し,ベースクラスの虚メソッドを継承する.
まとめは以下の通りです.
抽象メソッドと虚メソッドの違い:
~抽象メソッドと虚メソッドの違いは、仮想メソッドには実装部分があり、派生クラスにこのメソッドを上書きするオプションが提供されているのに対し、抽象メソッドには実装部分が提供されていないことである.強制派生クラスオーバーライドメソッド(そうでなければ派生クラスは具体的なクラスにならない);~abstractメソッドは抽象クラスでしか宣言できないが、虚メソッドはそうではない;~abstractメソッドは派生クラスで書き直さなければならないが、virtualは必要ない;~abstractメソッドはメソッドエンティティを宣言できない.虚方法則は可能である.
オーバーライド修飾子についてお話しします
(http://msdn.microsoft.com/zh-cn/library/ebca9ah3(v=vs.80).aspx)
継承されたメソッド、プロパティ、インデックス、またはイベントの抽象的なインプリメンテーションまたは虚のインプリメンテーションを拡張または変更するには、override修飾子を使用する必要があります.
overrideメソッドは、ベースクラスから継承されたメンバーの新しい実装を提供します.オーバーライドによって書き換えを宣言する方法を書き換えベースメソッドと呼ぶ.