C#學習第八天

接口(Interface):

C#中接口定義的規則:

1、接口本身的默認訪問級別爲internal,即程序集本身訪問級別

2、接口中方法不能使用任何訪問修飾符(例如 public private internal protected)等修飾。(系統自動爲其設置爲public)

3、不能使用virtual修飾

4、接口不能包含字段,無論是常量,還是實例字段,還是static字段,都不能包含。(字段本質上是類實現的一個方面,而接口不能包含任何實現細節)

5、接口不能包含構造函數(構造函數也被認爲是一種類的實現細節,與接口不包含任何實現衝突)

6、接口不能包含析構函數

7、接口中不能嵌套任何類型,無論是接口、類,還是結構、枚舉等類型。

 interface IComparable
    {
        /*
         * 接口不能包含字段,無論是常量,還是實例字段,還是static字段,都不能包含。
        public const int ID = 100;Error
         */

        /*
         * 接口中方法不能使用任何訪問修飾符(例如 public private internal protected)等修飾。(系統自動爲其設置爲public)
         * public int CompareTo(Object obj);
         */
        /*
         * 不能使用virtual修飾(編譯器自動爲其設置爲public)
         * virtual int CompareTo(Object obj);
         */
        int CompareTo(Object obj);
        void PrintMsg();

        /*
         * 接口中屬性不能使用任何訪問修飾符(例如 public private internal protected)等修飾。(系統自動爲其設置爲public)
         * public String Name { get; }屬性本身類似方法,所以規則相同
         */
        String Name { get; }

    }


 實現的類:

 class Info:Lesson2.IComparable
    {
        //顯示實現接口方法時,不能添加任何訪問修飾符.即是private的,所以不可見,只能通過接口實例才能訪問這種方法。
         //顯示實現接口方法主要用於實現多個接口,而這些接口有可能存在同名方法時使用(區別不同的接口方法)
        int IComparable.CompareTo(object obj)
        {
            return 0;
        }

        //非顯示實現接口方法時,訪問級別必須是public(即子類方法覆蓋父類或實現接口時不能降低訪問級別)
        public string Name
        {
            get { return "信息"; }
            set { Console.WriteLine("設置信息"); }//儘管接口沒提供set;子類仍然可是添加set;
        }

        //非顯示實現接口方法時,訪問級別必須是public(即子類方法覆蓋父類或實現接口時不能降低訪問級別)
        //可以把此方法聲明爲virtual,以便子類覆寫
        public virtual  void PrintMsg()
        {
            Console.WriteLine("你好,嘿嘿!");
        }
    }


使用:

           Info info = new Info();
           info.Name = "";
           Console.WriteLine(info.Name);

           //調用顯示實現的接口方法時,不能使用類實例,而要使用接口引用
           IComparable cp = info;
           Console.WriteLine(cp.CompareTo(1));//打印0

          //由於printMsg方法不是通過顯示接口實現的,所以可以通過實例引用調用,也可通過接口引用調用(多態)
           info.PrintMsg();//實例引用調用
           cp.PrintMsg();//接口引用調用
           Console.WriteLine(cp.Name);//接口引用調用屬性

 

抽象類:微笑鄙視

    //抽象類
    abstract  class abstractClass
    {
        //靜態構造函數,類似Java的靜態初始化塊,不能使用任何訪問修飾符,也不能有參數
        static abstractClass()
        {
            Console.WriteLine("抽選類abstractClass的靜態構造函數");
        }
        public abstractClass()
        {
            Console.WriteLine("抽選類abstractClass的構造函數");
        }

        public abstractClass(String msg)
        {
            Console.WriteLine("抽象類 abstractClass 的重載構造函數abstractClass(String msg)");
        }

        public void Hi()
        {
            Console.WriteLine("實例方法 Hi()!");
        }

        public static void Say()
        {
            Console.WriteLine("靜態方法 Say()");
        }

        /*
         * 構造函數不能是抽象的
        public abstract abstractClass(int i);
          */

        /*
         * 靜態方法不能標記爲virtual、 abstract、 override
        public abstract static void Say(int i);
         */
        public abstract void printMsg(String msg);
    }

    //實現抽象類
    class subClass : abstractClass
    {
        //靜態構造函數,類似Java的靜態初始化塊,不能使用任何訪問修飾符,也不能有參數
        //C#中靜態構造函數調用順序和Java不一樣,C#是先調用本類的靜態構造函數,再調用父類的靜態構造函數。Java相反.
        static subClass()
        {
            Console.WriteLine("subClass靜態初始化塊!");
        }

        public subClass(): base("我日!")
        {
            Console.WriteLine("subClass 構造函數!");
        }

        //抽象方法必須以override方式實現,與實現接口有點兒不一樣
        public override void printMsg(string msg)
        {
            Console.WriteLine("printMsg打印的信息是:{0}",msg);
        }
    }


使用:

            //抽象類使用         
             subClass sub = new subClass();
            abstractClass.Say();//抽象類調用靜態方法
            subClass.Say();//實現抽象類子類調用靜態方法(繼承的靜態方法)
            abstractClass subabc = sub;
            sub.printMsg("568");
            subabc.printMsg("123");


 


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章