接口
- 什么是接口?
- 接口就是一种规范,协议(*),约定好遵守某种规范就可以写通用的代码。
- 定义了一组具有各种功能的方法。(只是一种能力,没有具体实现,像抽象方法一样,“光说不做”)
- 接口存在的意义:多态。多态的意义:程序可扩展性。最终一让程序变的更灵活,节省成本,提高效率。
- 接口解决了类的多继承的问题
- 接口解决了类继承以后体积庞大的问题。
- 接口之间可以实现多继承
- 先从语法角度看一下接口,与抽象类类似。
接口的定义和一些概念
1 | class Program |
两个接口练习
- 案例(继承了一个类,同时实现了其他接口)
- 鸟-麻雀 sparrow[‘spereu],鸵鸟 ostrich[ostrit],企鹅penguin[pengwin],鹦鹉parrot[paeret]
- 鸟能飞,鸵鸟,企鹅不能。。。你怎么办
- 子类继承抽象类,实现接口
- 接口中的成员必须不能有实现,接口不能实例化。
- 接口中的成员不能有访问修饰符,隐式公开
public
接口中可以有属性、方法、索引器等(其实都是方法),但不能有字段 - 接口中的所有成员必须被子类中全部实现,除非子类是抽象类,把接口中的成员标记为抽象的。
- 练习:从学生,老师,校长类中抽象出人的类,学生和老师都有收作业的方法,但是校长不会收作业
1 | namespace xueXi_接口 |
1 | namespace xueXi_接口 |
再看一个接口案例
- 回顾:接口是一种规范。
- 什么是规范?理解规范的意义。规范,就是告诉我们要做什么,具有什么能力。
- 在程序中为什么需要规范?(多态,可以让我们编写通用的代码,提高程序的可扩展性)
- 接口就像“法律”。
- 登记方法(接口作为参数,实现多态)
DengJi(Person person)
//人口登记,Person
是抽象类DengJi(Car car)
//汽车也要登记DengJi(House house)
//房子也要登记.JiKou
DengJi(lJieKou jk);
1 | namespace xuexi_接口练习 |
显示接口
- 为什么要显示实现接口?
- 方法重名后的解决办法。
- 显示实现接口后,只能通过接口来调用。不能通过类对象本身来调用(显示实现的接口,查看
IL
是private
的,防止通过类来调用) - 为什么要有“显示实现接口”?
- 可以解决重名方法的问题。T
- 什么是“显示实现接口”?
- 实现接口中的方法时用:
接口名.方法名()
,并且没有访间修饰符,private
- 实现接口中的方法时用:
- “显示实现接口”后怎么调用?
- 只能通过接口变量来调用,因为显示实现接口默认为
private
。
- 只能通过接口变量来调用,因为显示实现接口默认为
1 |
|
接口的总结
- 接口是一种规范。为了多态。
- 接口不能被实例化。
- 接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为
public
,不能修改。(默认为public
) - 接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)
- 接口中只能有方法、属性、索引器、事件,不能有“字段”。
- 接口与接口之间可以继承,并且可以多继承。
- 实现接口的子类必须实现该接口的全部成员。
- 一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了
父类A
,并实现了接口IA
,那么语法上A
必须写在IA
的前面。class MyClass:A, IA {}
,因为类是单继承的。 - 当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现为
abstract
。(抽象类也能实现接口,用abstrac
标记) - “显示实现接口”,只能通过接口变量来调用(因为显示实现接口后成员为
private
)。
使用接口的建议
- 面向抽象编程,使用抽象(父类、抽象类、接口)不使用具体。
- “向上转型”
- 在编程时:
- 接口 -> 抽象类 -> 父类 -> 具体类(在定义方法参数、返回值、声明变量的时候能用抽象就不要用具体。)
- 能使用接口就不用抽象类,能使用抽象类就不用类,能用父类就不用子类。
- 避免定义“体积庞大的接口”、“多功能接口”,会造成“接口污染”。只把相关联的一组成员定义到一个接口中(尽量在接口中少定义成员)。单一职责原则
- 定义多个职责单一的接口(小接口)(组合使用)。(印刷术与活字印刷术)
- 随着学习的深入再继续体会接口的作用。
抽象类复习、简单工厂设计模式复习
- 抽像类:
- 不能被实例化,需要被继承。多态。
- 子类必须重写父类中的所有的抽象成员,除非:子类也是一个抽象类。
- 抽象成员在父类中不能有任何实现。
- 抽象类中可以有实例成员。
- 抽象成员的访问修饰符不能是
private
- 抽象成员只能写在抽象类中。
- abstract
- 作业:通过案例笔记本电脑的选择。
- 笔记本电脑父类
NoteBook
、不同品牌的笔记本产品。(继承+简单工厂)
- 笔记本电脑父类
接口复习
- 定义接口的语法(
interface
)- 接口中只能包含方法、属性、索引器、事件。不能包含字段。见备注1(貌似事件像一个字段?其实是两个方法。
reflector
查看源码) - 接口中的成员不能有任何的实现(真正的“光说不做”。思考这样做的意义。联想抽象类中的抽象方法。)
- 接口中的成员不能写访间修饰符。
- 接口中只能包含方法、属性、索引器、事件。不能包含字段。见备注1(貌似事件像一个字段?其实是两个方法。
- 使用接口的语法
- 一个类可以实现多个接口。
- 实现接口的类,必须把接口中的所有成员都实现。
- 子类实现接口中的成员时,不能修改成员的访间修饰符、参数列表、方法名等。(与方法重写一样)
面试题
- 如何使用
virtual
和override
?Person per = new Student();
per.SasHI()
调用的子类重写的SayHi
方法(语法、应用(多态))
- 如何使用
abstract
和override
? - “方法重载
overload
”、“方法重写override
”、”隐藏new
”是同一个概念吗? - 抽象类和接口的区别?见备注1.
- 抽象类适用于同一系列,并且有需要继承的成员。
- 接口适用于不同系列的类具有相同的动作(行为、动作、方法)。
- 对于不是相同的系列,但具有相同的行为,这个就考虑使用接口。
- 接口解决了类不能多继承问题。
virtual
: 是用来标记虚方法的。override
: 是进行方法重写的,当子类继承父类的时候重写父类的方法。
参考:
1.link-01 // B站 -> C#.Net基础加强第四天-接口与异常处理 -> 传智播客