问题描述
- 接口的作用 面向对象设计
-
不好意思,也许我这个问题很低级,但是困恼自己好久,今天鼓起勇气问下大家,希望各位oo大神能不吝赐教
如题,有一个和接口非常相似的存在:抽象类,它们都是对职责的抽象,区分2者还是比较简单的,抽象类表示是is-a,表示一个类型,是类型的抽象,而接口是行为的抽象。
一个抽象类的方法并不能用来用来定义一个类型,举个例子:猫会叫,但是会叫的不一定是猫,比如说闹钟也会叫。既然如此,那一个行为到底是该定义在抽象类中,还是应该定义在接口中。比如说刚才的例子,叫这个行为到底应该定义在猫中,还是应该定义在ISayable接口中?问题在推广下,何时该把类中的行为抽出来定义成一个接口,也就是何时该使用接口?个人意见这里面一定有业务层面的考虑,没有一个决定的标准,比如说如果只有一个猫这种抽象,没有闹钟这个抽象就没有必要用专门定义一个ISayable接口
经常有接口的滥用,个人认为接口的滥用更多的是凡是都用接口,比如现在的service+impl设计模式,明明只有一个实现类,一定要都定义一个接口
目前自己的开发经验是这样的:从重构的观点去看接口的定义,一开始是没有任何接口的,只有无所的类,在需求不断变更中,发现共性的行为及行为的不同实现,在抽取成接口。也就是说在承认自己水平不够的情况下(无法一下子考虑行为的抽象),不建议一开始就定义接口,而是随着需求的变化中去添加接口
解决方案
解决方案二:
你说的没有错。分层的目的最终是为了层的替换,但是培训班往往为了分层而教你分层。所以机械地把代码抽象成接口,再创建唯一的实例。
这离真正的软件设计相去甚远甚至背道而驰。
你自己总结的很好,定义接口并不是只有优点没有缺点的。一旦你定义了接口,那么这个接口中的方法必须被实现,无论它有没有意义。所以根本不懂软件设计的人草率地定义一个接口,会给项目带来很大的问题。后续的开发者无法轻易修改接口,因为你要修改接口意味着你必须保证它的全部实现的代码都必须追回来修改。
解决方案三:
接口的使用,你自己总结的是一种使用的场合。
还有一种场合就是接口用在模块之间。
比如c++中,我喜欢把接口指针封装在一个dll的导出函数的参数中。外部调用者通过这个方法得到一个接口类指针,然后调用接口的方法得到各种功能,这样dll只需要导出一个方法。
还有一个好处就是这样以后我的接口有了新方法,它只需要更新接口类的头文件就可以使用。
解决方案四:
公司的项目都是定义成接口类的,抽象类还是比较少。接口的定义肯定一般都要提前想好。比如dao层的接口,基本上都是一样的,就可以结合范型来用
时间: 2024-10-31 21:17:21