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");


 


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值