• 接口


      ---->接口是一种能力
      ---->接口也是一种规范
      ---->如果你继承了这个接口,就必须按照接口的要求来实现这个接口。(如Usb口)
      interface I开头...able结尾

      只要一个类继承了一个接口,这个类就必须实现这个接口中所有的成员

      接口的功能要单一

      为了多态。 接口不能被实例化。
      也就是说,接口不能new(不能创建对象)
      跟抽象类是一样的,因为创建对象也没意义。


      接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。
      类中的成员默认的访问修饰符是private ,而接口中默认的访问修饰符是public

      (默认为public) 接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。


      接口中只能有方法、属性、索引器、事件,不能有“字段”和构造函数。

      接口与接口之间可以继承

      接口并不能去继承一个类,而类可以继承接口 (接口只能继承于接口,而类既可以继承接口,也可以继承类)

      实现接口的子类必须实现该接口的全部成员。

      一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。


      class MyClass:A,IA{},因为类是单继承的。

      显示实现接口的目的:解决方法的重名问题
      什么时候显示的去实现接口:
        当继承的接口中的方法和参数一摸一样的时候,要是用显示的实现接口

        当一个抽象类实现接口的时候,需要子类去实现接口。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 接口
    {
        class Program
        {
            static void Main(string[] args)
            {
                //接口不能被实例化
                //IDraw d1 = new IDraw();
    
                //但是可以将接口指向继承该接口的子类
                IDraw d1 = new Student();
                d1.Draw();//显示Student likes draw
                //d1.Speak();//接口没有包含这个定义
                 
                IDraw d2 = new Teacher();
                d2.Draw();//显示Teacher likes draw
    
                Student stu = new Student();
                stu.Draw();
                stu.Speak();
    
                
    
                Console.WriteLine("
    
    ");
                MyPerson per1 = new MyPersonSon();
                per1.Eat();//虚方法的override,调用MyPersonSon中实现
                per1.Drink();//实方法中new,调用MyPerson中实现
                MyPerson per2 = new MyPersonDaughter();
                per2.Eat();//虚方法的override,调用MyPersonDaughter中实现
                per2.Drink();//实方法中new,调用MyPerson中实现
                //Console.ReadKey();
    
                Console.WriteLine("
    
    ");
                MyPersonSon per3 = new MyPersonSon();
                per3.Eat();//虚方法的override,调用MyPersonSon中实现
                per3.Drink();//实方法中new,调用MyPersonSon中实现
                Console.ReadKey();
            }
        } 
    
        //子类至多只继承一个父类,但可以继承多个接口
         class Person
         {
             public void Speak()
             {
                 Console.WriteLine("Sleep");
             }
         }
    
        interface IDraw//可以继承其他接口,但是不能继承类
        {
            //接口成员是public,但是不能加public
            void Draw();
            //接口的功能要单一,不能有其他行为
            //void Eat();
    
            //
            //接口中只能有方法、属性、索引器、事件,不能有“字段”和构造函数(不能被实例化)
        }
    
        //继承父类,对父类成员可以重写,使用override
        //继承接口,对接口成员需要实现
        //继承接口的子类,需要实现所有接口的成员,如果一个子类同时继承
        //了父类A和接口IA,那么父类必须放在接口之前,因为类是单继承的
        //class MyClass : A, IA { }
        class Student:Person,IDraw//基类必须在接口之前
        {
            public void Draw()
            {
                Console.WriteLine("Student likes draw");
            }
    
            public new void Speak()
            {
                Console.WriteLine("Student Sleep");
            }
        }
    
        class Teacher:Person,IDraw
        {
    
            public void Draw()
            {
                Console.WriteLine("Teacher likes draw");
            }
    
            public new void Speak()
            {
                Console.WriteLine("Teacher Sleep");
            }
        }
    
        interface IEat
        {
            void Eat();
        }
        
        interface IDrink
        {
            void Drink();
        }
    
    
        public abstract class MyPerson: IEat,IDrink
        {
            public void Test()
            {
                Console.WriteLine("抽象类实现自己的成员");
            }
    
            virtual public void Eat()
            {
                Console.WriteLine("抽象类实现接口成员Eat");
            }
    
            public void Drink()
            {
                Console.WriteLine("抽象类实现接口成员Drink");
            }
        }
    
        //尽量不要让父类继承接口
        //如果想实现多态,需将接口定义成虚函数,并在子类中override
        //如果不用虚函数,而是用普通函数,则在子类中new之后,使用父类变量引用子类对象,并不能实现多态。
        public class MyPersonSon : MyPerson
        {
    
            //public void Eat()
            //{
            //    throw new NotImplementedException();
            //} 
         
            //鼠标放在接口名称上,出现小蓝色框时,按下alt+shift+F10,选择显示实现接口
            override public void Eat()
            {
                Console.WriteLine("son 普通实现Eat");
            }
    
            new public void Drink()
            {
                Console.WriteLine("son 普通实现Drink");
            }
        }
         
        public class MyPersonDaughter : MyPerson
        {
    
            override public void Eat()
            {
                Console.WriteLine("daughter 普通实现Eat");
            }
    
            //隐藏了继承的MyPerson.Drink(),最好使用new,来显示是故意隐藏
            public void Drink()
            {
                Console.WriteLine("daughter 普通实现Drink");
            }
        }
    }
    

     

    练习

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 接口练习
    {
        class Program
        {
            static void Main(string[] args)
            {
                DenJi(new Person());
                DenJi(new House());
    
                Console.ReadKey();
            }
    
            static void  DenJi(IDengJi dj)
            {
                dj.DengJi();
            }
        }
    
        interface IDengJi
        {
            void DengJi();
        }
    
        class Person:IDengJi
        {
            public void DengJi()
            {
                Console.WriteLine("人需要登记");
    
            }
        }
    
        class House : IDengJi
        {
            public void DengJi()
            {
                Console.WriteLine("房子需要登记");
    
            }
        }
    
    }
    

      

     

  • 相关阅读:
    C#序列化效率对比
    将聚合记录集逆时针和顺时针旋转90度(行列互换)
    Sql的行列转换
    log4net配置
    input框添加阴影效果
    WCF自定义地址路由映射(不用svc文件)
    Jquery对当前日期的操作(格式化当前日期)
    用JQuery获取输入框中的光标位置
    sublime text3安装后html:5+Tab不能快速生成html头部信息的解决办法
    js获取url传递参数,js获取url?号后面的参数
  • 原文地址:https://www.cnblogs.com/my-cat/p/7614754.html
Copyright © 2020-2023  润新知