C#中关于接口(Interface)的详解(附带案例)

前言:相信在生活中,"接口"这个词对于大家来说都不陌生吧,比如说:很多不同的软件都拥有查看天气这个功能,难道说每个软件都有对应的气象局?这是因为气象局给了它们一个接口,进而实现天气功能的,显而易见接口的作用了,今天跟随博主一起来了解一下"接口"吧::::

一.接口含义:

接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 "怎么做"部分。通俗来讲就是接口定义了一些行为,继承接口的类应该必须拥有这些行为,按照这些行为去做…

二.接口的声明:

接口必须用关键字interface来进行声明,一般格式如下所示:

访问修饰符 interface interface_name
{ 
     接口成员
}

举例:我们定义了一个接口…

 interface INmyface//接口一
    {
    }

😃接口的默认修饰符为public哦 !
注意:接口只能用 public 和 internal 访问修饰符!!!否则就会报错,例如:
在这里插入图片描述
在这里插入图片描述

三.接口成员:

1.接口成员的包含:

接口成员:接口只包含方法、属性、索引器和事件的签名

2.接口成员的定义:

接口成员定义与类成员定义相似,但是要注意:接口中成员变量的默认访问修饰符为 final ,成员方法的默认访问修饰符为 static
1. 接口成员不允许使用访问修饰符(public,private,protected 或 internal),所有的接口成员都必须是公共的;
举例:
在这里插入图片描述
2.接口成员不能用关键字static,virtual,abstrac t或 sealed 来对其定义;
举例:
在这里插入图片描述
3. 接口成员不能包含代码实体;
4.接口成员不能定义字段成员;
举例:我们定义了一个字段 A 会提示报错:
在这里插入图片描述

3.举例:

我们定义了一个接口,并定义了几个接口成员:

  interface INmyface//接口一
    {
        //4个方法
        void Run();
        void Say();
        void Eat();
        void Sleep();
        //一个属性
        int Age { get ; set; }
    }

四.接口的特点:

1. 接口必须用interface进行声明;

 interface INmyface//接口一
    {
    }

2. 接口中只能放成员的声明;

 interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
    }

3. 继承接口必须实现接口中的所有成员,如果在接口中新增成员的声明,而在继承的类中没有进行实现时,就会报错,如:
在这里插入图片描述
4. 接口之间可以互相继承,但是要实现接口功能的派生类必须实现每个接口的成员:
如:我们定义了一个接口INmyface,另一个接口INsecond继承了INmyface这个接口,那么当子类继承INsecond这个接口时,就要实现这两个接口中所有的成员:

 interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
        void DDD();
    }
    interface INsecond : INmyface//继承接口,接口之间的继承
    {
        void Day();
    }
     class Son : INsecond 
    {
        public int Age { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        public void Day()//继承接口以后,接口二独有的方法
        {
            Console.WriteLine("我是第二个接口中独有的方法");
        }
        public void DDD()
        {
            Console.WriteLine("我会打游戏,---来自第一个接口");
        }
        public void Eat()
        {
            Console.WriteLine("我会吃,---来自第一个接口");
        }
        public void Run()
        {
            Console.WriteLine("我会跑---来自第一个接口");
        }
        public void Say()
        {
            Console.WriteLine("我会说话---来自第一个接口");
        }
        public void Sleep()
        {
            Console.WriteLine("我会睡觉---来自第一个接口");
        }
    }

如果说,我们只实现了第一个接口的成员,而没有实现第二个接口独有的成员,那么就会报错,如下图所示:
在这里插入图片描述
温馨提示: 在上面举例中,我们只实现了第一个接口的成员,忽略了第二个接口的成员,那么系统就会报错,在此提醒小伙伴们千万别忘记一定要实现所有的成员哦!
5.一个类可以继承多个接口,但是每个接口的成员必须进行实现:
注:在继承多个接口时每个接口之间用","进行连接
举例:

interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
        void DDD();
    }
interface INseconde//接口二
    {
        void Day();
    }
    interface INThird//接口三
    {
        void Sun();
    }
    class Son : INseconde,INmyface, INThird
    {}
    //在此举例时就不再次写实现成员的过程了

如果忘记了任何一个接口成员时,就会:
在这里插入图片描述

五.接口的实现:

前面说了那么多,那接口到底怎样在派生类中进行实现呢?,一般有两种实现形式:

1.隐式实现:

所谓的隐式实现就是对其中的方法等进行重写,举例:

public void DDD()
        {
            Console.WriteLine("我会打游戏,---来自第一个接口");
        }

2.显示实现:

显示实现:使用接口名点成员实现,创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的:类型 接口名称.方法{}
举例,我们在原有接口中对INseconde中的方法和INmyface中的属性进行显示实现:(因为我们只更改这两个所以只写了这两个)

   class Son : INseconde,INmyface, INThird
    {
        int INmyface.Age
        {
            get;
            set;
        }
        void INseconde.Day()
        {
            Console.WriteLine("我是第二个接口中独有的方法");
        }
     }

main函数中,因为用到了一个全新的概念申明类,这个知识点在下篇文章将会介绍到:

 static void Main(string[] args)
        {
            //Son son = new Son();
            //申明类
            INmyface nn = new Son();
            INseconde nmyface = new Son();
            nmyface.Day();
            nn.Age = 1;
            Console.WriteLine("这是第{0}次了解接口",nn.Age);
            Console.ReadLine();
        }

运行结果:
在这里插入图片描述

3.隐式实现与显示实现的区别:

两者最大的区别就在于,隐式实现是接口和类都可以进行访问,显示实现只有接口可以进行访问!

六.使用接口的目的(作用):

1.一个接口内,允许包含变量、常量等一个类所包含的基本内容。但是,接口中的函数不允许设定代码,也就意味着不能把程序入口放到接口里。由上可知,接口是专门被继承的。接口存在的意义也是被继承;
2.接口的主要目的是为不相关的类提供通用的处理服务,由于C#中只允许树形结构中的单继承,即一个类只能继承一个父类,所以接口是让一个类具有两个以上基类的唯一方式;

七.接口应用的详细举例:

 interface INmyface//接口一
    {
        void Run();
        void Say();
        void Eat();
        void Sleep();
        int Age { get ; set; }
        void DDD();
    }
    interface INseconde:INFour//接口二
    {
        void Day();
    }
    interface INThird//接口三
    {
        void Sun();
    }
    interface INFour//接口用于被继承
    {
        void Sum();
    }
    class Son : INseconde,INmyface, INThird
    {
    //1.显示实现
       // int INmyface.Age
       // {
       //     get;
       //     set;
        //}
     //2.隐式实现
        public int Age {
            get { return 1; }
            set { Age = value; }  
        }
        //1.显示实现
         //void INseconde.Day()
        //{
         //   Console.WriteLine("我是第二个接口中独有的方法");
        //}
        //2.隐式实现
        public void Day()//继承接口以后,接口二独有的方法
        {
            Console.WriteLine("我是第二个接口中独有的方法");
        }
        public void DDD()
        {
            Console.WriteLine("我会打游戏,---来自第一个接口");
        }
        public void Eat()
        {
            Console.WriteLine("我会吃,---来自第一个接口");
        }
        public void Run()
        {
            Console.WriteLine("我会跑---来自第一个接口");
        }
        public void Say()
        {
            Console.WriteLine("我会说话---来自第一个接口");
        }
        public void Sleep()
        {
            Console.WriteLine("我会睡觉---来自第一个接口");
        }
        public void Sum()
        {
            Console.WriteLine("我是用来统计的,---来自接口的继承");
        }
        public void Sun()
        {
            Console.WriteLine("今天是晴天,---我来自第三个接口");
        }
         class Program
    {
        static void Main(string[] args)
        {
            Son son = new Son();
            INmyface nn = new Son();
            INseconde nmyface = new Son();
            nmyface.Day();//显示实现
            nn.Age = 1;//显示实现
            son.Run();
            Console.ReadLine();
            //son.Say();
            //Console.ReadLine();
            son.Eat();
            Console.ReadLine();
            son.Sleep();
            Console.ReadLine();
            son.Day();
            Console.ReadLine();
            son.DDD();
            Console.ReadLine();
            son.Sum();
            Console.ReadLine();
            son.Sun();
            Console.ReadLine();
            Console.WriteLine("这是第{0}次了解接口",nn.Age);
            //Console.WriteLine("这是第{0}次了解接口",son.Age);
            Console.ReadLine();
        }
    }

运行结果:
在这里插入图片描述


以上是我对接口的一些了解,若有不足海望大家提出,谢谢😃😦😃

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