黒馬プログラマー:C#基礎編(四)抽象類、インタフェース、継承と多態

7264 ワード

---------------------- ASP.Net+Android+IOS開発、.Netトレーニング、ご交流お待ちしております!-----------------------
抽象クラス
抽象クラスとインタフェースは主にマルチステートを実現するために使用され、abstractキーワードを使用して継承用途のみに使用されるクラスとメンバーを作成できます.インタフェースについては、定義から方法の抽象であることがわかり、対の能力の抽象を記述することもできる.抽象類は物事の抽象であり、具体的な対象と関係がある.抽象クラスのメンバーは一般クラスと変わらないが、一般的に抽象的に定義され、派生クラスに書き換えられ、多態を実現する.一般的に定義された抽象メンバーには方法、イベント、属性、インデックスがある.抽象クラスのコンストラクション関数は、主に非抽象メンバーの初期化を目的としています.抽象クラスはインスタンス化できません.派生クラスは、親クラスの非パラメトリックコンストラクション関数をデフォルトで呼び出すので、プライベートではありません.例:
    delegate void MyDelegate();
    abstract class MyClass
    {
        public abstract void Func();//          
        public abstract string AttriBute
        {
            get;//         
            set;
        }
        public abstract string this[int num]
        {
            get;//     
            set;
        }
        public abstract event MyDelegate BaseEvent;
    }
    class MyClass1:MyClass
    {
        public override string AttriBute
        {
            get
            {
                return "123";
            }
            set
            {
                Console.WriteLine(value);
            }
        }
        public override string this[int num]
        {
            get
            {
                return num.ToString();
            }
            set
            {
                Console.WriteLine(value);
            }
        }
        public override void Func()
        {
            Console.WriteLine("123");
        }
        public override event MyDelegate BaseEvent;//    add,remove   
   }

抽象クラスの抽象メンバーは、カスタマイズしたり、インタフェースから来たり、ベースクラスから来たりすることができます.ベースクラスのダミーメソッドをabstractで修飾します.例:
    interface IMyInterface
    {
        string Attribute
        {
            get;
        }
    }
    class TestClass
    {
        public virtual void Func()
        { 
            //...
        }
    }
    abstract class BaseClass : TestClass, IMyInterface
    {
        public abstract string Attribute
        {
            get;//       
            set; //       
        }
        public abstract new void Func();//      
    }

インタフェース
インタフェースは主にマルチステートとマルチ継承を実現するためである.インタフェースの特徴:
(1)クラスまたは構造は複数のインタフェースを継承することができる
(2)クラスまたはインタフェースがインタフェースを継承するときにメンバー定義を継承するが、実装を継承しない
(3)抽象ベースクラスのように,インタフェースを継承する非抽象タイプはすべてインタフェースのすべてのメンバーを実現しなければならない.
(4)直接インスタンス化できない
(5)イベント、インデックス、プロパティ、メソッドを含めることができる
(6)メソッドを含まない実装
(7)クラスとインタフェースは複数のインタフェースから継承可能
(8)自身が複数のインタフェースから継承可能
インタフェースを実装するには、クラス内の対応するメンバーが共通で静的ではなく、インタフェースメンバーと同じ署名と名前を持つ必要があります.インタフェースを実現するクラスは三つに分けられ、一つは抽象クラス、二つは一般的なクラス、それから構造である.実装方式は実装インタフェースと明示的実装インタフェースに分けられる.
    interface IMyInterface
    {
        void Func();
        string this[int index] { get; set; }
        string Value { get; set; }
        event EventHandler MyEventHandler;
    }
    public abstract class MyClass : IMyInterface 
    {  
        public void Func() 
        { 
        //      
        } 
        public string Value {  get;  set; } 
        public event EventHandler MyEventHandler; 
        public string this[int index] 
        {  
            get 
            {
                //      
            } 
            set 
            { 
                //      
            } 
        }
    } 

ここでの属性はインタフェースの属性とは意味が異なり、ここでは自動属性であり、コードのバックグラウンドコンパイラで自動的にフィールドが生成され、getとsetリーダーが埋め込まれます.ここのイベントもインタフェースのイベントとは意味が異なり(コードの観点からほぼ同じ)、ここのイベントでは、コンパイラは自動的に同名のプライベート委任を生成し、addメソッドとremoveメソッドを補完します. 
インタフェースメンバーを具体的に実装したくない場合は、abstractを前に追加すればいいです.
    public abstract class MyClass : IMyInterface 
    {
        public abstract void Func();
        public abstract string Value {  get;  set; } 
        public abstract event EventHandler MyEventHandler;
        public abstract string this[int index] { get; set; }
    } 

実装を表示すると(1)実装されたインタフェースが表示され、修飾子(2)イベントへのアクセスが許可されずデフォルトのシステムカスタマイズが許可されない方式があり、addメソッドとremoveメソッドを自分で追加する必要がある(3)また実装インタフェースを表示するメンバーはabstractで修飾を許可しない.
    public abstract class MyClass : IMyInterface 
    {
        void IMyInterface.Func()  
        {  
            //    
        }  
        string IMyInterface.Value  {   get;   set;  }  
        event EventHandler IMyInterface.MyEventHandler  
        {  
            add 
            {   
                //      
            } 
            remove 
            {
                //      
            } 
        }
        string IMyInterface.this[int index]
        {
            get
            {
                //      
            }
            set
            {
                //     
            }
        }
    } 

カプセル継承マルチステート
パッヶージ
カプセル化とは、データとデータベースの操作をカプセル化し、データがタイプの内部に保護され、システムの他の部分は、データの外に包まれた許可された操作によってのみ、このデータタイプと交流し、対話することができることを意味する.
sealedキーワードは派生を防止します.クラスではクラスの派生を防止し、メンバーではメンバーの継承を中断できます.
継承
継承は親クラスのすべての共通メンバーを継承します.サブクラスでは非表示にできます.書き換えることができます.例:
    class A
    {
        public string str = "A";
        public void Show()
        { Console.WriteLine("Show A"); }
    }
    class B:A
    {
        public string str = "B";
        public virtual void Show()
        { Console.WriteLine("Show B"); }
    }
    abstract class C:B
    {
        public abstract void Show();//    
        //public override void Show()//    
        //{ Console.WriteLine("Show C"); }//           ,             ,                 
    }
    class D:C
    {
        public string str = "D";
        public override void Show()//        ,         
        { Console.WriteLine("Show D"); }
    }
    class MyClass
    {
        static void Main(string[] args)
        {
            D d = new D();
            C c = d;
            B b = d;
            A a = d;
            Console.WriteLine(d.str);//D
            Console.WriteLine(c.str);//B
            Console.WriteLine(b.str);//B
            Console.WriteLine(a.str);//A

            Console.WriteLine();
            
            d.Show();//D
            c.Show();//D
            b.Show();//B
            a.Show();//A
            Console.ReadKey();
        }

マルチステート
マルチステートは、クラスまたはインタフェースを継承することによって、独自のタイプ、任意のベースタイプ、またはインタフェースを実装する際にインタフェースタイプとして使用できるなど、複数のタイプとして使用できます.これをマルチステートと呼びます.例:
    abstract class Myclass
    {
        public abstract void Func();
    }
    class A : Myclass
    {
        public override void Func()
        {
            Console.WriteLine("  A");
        }
    }
    class B : Myclass
    {
        public override void Func()
        {
            Console.WriteLine("  B");
        }
    }
    class C : Myclass
    {
        public override void Func()
        {
            Console.WriteLine("  C");
        }
        static void Main(string[] args)
        {
            List list = new List();
            list.Add(new A());
            list.Add(new B());
            list.Add(new C());
            foreach (Myclass item in list)
            {
                item.Func();
            }
            Console.ReadKey();
        }
    }

---------------------- ASP.Net+Android+IOS開発、.Netトレーニング、ご交流お待ちしております!-----------------------