这是一篇纯文字的文章,可能需要静心阅读。
这让我想起了年轻时候,我已不再少年。那时候我游走于各家公司去面试,倒是遇到了几个问此问题的面试官。
多年过去后,有感而发,现在回头看,提这个问题,对经验不丰富的我,那时候只能靠背,知其然不知所以然,而且回答的估计也不到什么点上。
不知道各位同学是否也有这样的经历?!
这个问题对于经验不丰富的同学,真是很有难度的。除了背之外,自身的理解很浅显。
回到话题本身,类、抽象类和接口之间的区别,如何理解它们?
1.抽象层次
接口是顶级抽象,抽象类是次级抽象,类是对世界的理解和具体实现。
2.关系继承
类,仅允许继承另一个类,该类可以是具体类,也可以是抽象类,但类,可以实现多个接口。
抽象类,在关系继承上,与具体类是一样的。
3.实现层次
类,是对世界的理解并使用具体逻辑进行实现。
抽象类,定义了世界的基本框架和结构要求,抽象类提供了所有子类的模板。
接口,是对世界的极致单一抽象。它是最小最细的抽象。
4.思想原则
三者在实际编码中,应严格遵循面向对象原则,即单一、开闭、替换、依赖倒转、接口隔离。通过这个思想原则,可以指导我们创建对于业务世界的编码理解。
5.区别
接口是顶级抽象,接口的抽象,是极为考验程序员水平能力的。接口抽象不单是针对业务抽象,还针对行为、设计、框架等多方面的思考,可以说你有多高的项目全局观,就可以设计出多抽象的接口。
抽象类是具体实现类的模板抽象,即使是单一业务的抽象类,因为考虑到实际实现的因素,可能都会有提供一些子类所需要的父类共性方法或属性信息。
类,则是负责具体实现。
6.对外开放
在开放api方面,对于调用者来说,他并不需要知道你的api具体实现细节,仅需要知道有什么方法,实现什么功能,怎么使用即可。
请您记住:“所有类,都是某种意义的具体实现”,所以,我们应该尽可能隐藏类和抽象类,开放接口。
以上限于我经验的理解,您可以描述得更多。
总而言之,这个问题,面试官拿去问经验还不够丰富,比如3年以下的,多少还是有些不合时宜的。因为这些程序员更多的是实现功能,而不会考虑设计,不会考虑抽象层面的问题。对于他们来说,能实现功能就不错了。
当您有了对抽象的理解后,您的阶梯将迈进另一个世界:C#变成了你的实现世界的工具。
祝您用餐愉快。