Interface 【接口的使用】 可定义属性,方法,索引器和事件的签名,不可定义字段
一.接口含义:
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 "怎么做"部分。通俗来讲就是接口定义了一些行为,继承接口的类应该必须拥有这些行为,按照这些行为去做…【接口定义了大方向的使用部分,比如一天的工作量,第一做什么,第二做什么,第三做什么】【类继承接口后,就要把第一做什么的这个事情给具体化】
二.接口的声明:接口必须用关键字interface来进行声明,一般格式如下所示:
访问修饰符 interface interface_name { 接口成员 }举例:我们定义了一个接口…
interface INmyface//接口一 { }😃接口的默认修饰符为public哦 !注意:接口只能用 public 和 internal 访问修饰符!!!否则就会报错,例如:
三.接口成员:
1.接口成员的包含:接口成员:接口只包含方法、属性、索引器和事件的签名
2.接口成员的定义:接口成员定义与类成员定义相似,但是要注意:接口中成员变量的默认访问修饰符为 final ,成员方法的默认访问修饰符为 static1. 接口成员不允许使用访问修饰符(public,private,protected 或 internal),所有的接口成员都必须是公共的;举例:
2.接口成员不能用关键字static,virtual,abstrac t或 sealed 来对其定义;举例:
3. 接口成员不能包含代码实体;4.接口成员不能定义字段成员;举例:我们定义了一个字段 A 会提示报错:
3.举例:我们定义了一个接口,并定义了几个接口成员:
四.接口的特点: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(); } }
运行结果:
八:其它应用场景的接口展现
九:其他链接
C#系列之接口介绍_c# 接口-CSDN博客 显隐式调用
C#接口归纳总结实例详解_c#接口实例-CSDN博客
十:泛型接口具体应用
1>自定义泛型接口
和普通接口一样,一个泛型接口通常也是与某些对象相关的约定规程。泛型接口的声明如下:
interface [接口名]
{
[接口体]
}
在c#中,通过尖括号“<>”将类型参数括起来,表示泛型。声明泛型接口时,与声明一般接口的唯一区别是增加了一个
泛型接口定义完成之后,就要定义此接口的子类。定义泛型接口的子类有以下两种方法。
(1)直接在子类后声明泛型。
(2)在子类实现的接口中明确的给出泛型类型。