当前位置: 首页 > 知识库问答 >
问题:

在不破坏实现的情况下向类添加方法

乐刚毅
2023-03-14

假设我有两个类叫做classcowadclasspig

它们都实现了接口动物

对于接口只有两种方法,分别称为public void eat()public void speak()

一切都很好。但是,虽然这似乎很好地利用了接口s,但我认为如果我需要向这个接口添加方法,实现就会中断,即我需要去实现这些类中的新方法,这打破了“封闭-开放原则”。

所以我想,除了接口,如果将来需要添加新方法,我还会使用抽象类。

例如,公共类Cow扩展。。。实现动物

这听起来是个好计划(如果不是,请纠正我)。

但问题是,如果这些类扩展已经有其他类了怎么办?在这种情况下,我不能扩展2个类。

所以我的问题是:

有没有一种模式可以让我声明一个相关类的公共接口,同时保留将来添加新方法的能力,而不破坏“封闭-开放原则”,也不破坏实现?

共有2个答案

佟阳云
2023-03-14

在Java8中,接口可以为此定义默认方法。

利稳
2023-03-14

对于Java8,有一些默认方法

public interface Animal {

    void eat();
    void speak();
    default void sleep(){}

}

现在你的动物必须覆盖,但可以选择覆盖睡眠

在Java 8之前,使用抽象类是防止实现每个接口方法的常用方法。正如您所指出的,这不适用于多重继承,因此不能用于解决所有情况。

注意:不要声明接口方法公共,这是所有接口成员的默认可见性。

 类似资料:
  • 我最近通过从源代码编译在CentOS机器上安装了Python 2.7.3。Python 2.7.3安装在/opt/python2.7上,当我安装它时,我只需更改/usr/bin/Python以指向新版本。这显然是错误的,因为当我这样做的时候,它打破了百胜。我会得到以下内容。 我更改了/usr/bin/python以指向python 2.6.6,但现在2.6.6是python的默认版本。你知道怎么解

  • 为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了ClientHTTPPrequestinterceptor。。。 响应主体是一个流,如果我将其读取到我的拦截器中,TestRestTemplate将无法将其反序列化到我的对象模型中。换句话说,当我调用testRestTemplate时。获取…我将始终获取空对象(即使我看到对象我的响应)。 要解决RestTe

  • 本文向大家介绍Linux中在不破坏磁盘的情况下使用dd命令,包括了Linux中在不破坏磁盘的情况下使用dd命令的使用技巧和注意事项,需要的朋友参考一下 无论你试图从即将坏掉的存储驱动器抢救数据,将归档备份到远程存储,还是在别处对活动分区制作一份完美副本,都要知道如何安全可靠地复制驱动器和文件系统。幸好,有dd这款简单而强大的镜像复制工具,而且历史悠久。在这方面没有比它更出色的工具了。 dd命令的解

  • 我已经创建了一个在视觉上类似于一张卡(游戏卡)的对象-一张顶部有图像的卡,下面有一些关于该卡的信息,包括文本和符号。页面上可以有许多卡片。 单击一张卡片会将用户带到一个新页面。这是通过使用href将所有卡片元素包装在一个div中完成的。每张卡都有一个带有一些选项的下拉菜单。最初的问题是,单击下拉菜单时,卡也会被单击。 我想在单击下拉菜单时阻止卡被单击。单击下拉菜单时,下拉菜单本身应正常运行。 hr

  • 当我这样做的时候,变量'amount'不是正确的答案,因为a现在是,用pylint的话说是'tuple',所以amount将从返回a+4,变为返回(a,a+5)+4 我如何将'a+5'添加到foo中,同时仍然允许amount是单个标量值,而不是元组?

  • 问题内容: Elasticsearch具有内置的“突出显示”功能,该功能可让您在结果中标记匹配的词(比起初听起来更复杂,因为查询语法可能包含接近匹配等)。 我有HTML字段,当我打开突出显示功能时,Elasticsearch会遍历整个HTML语法。 以这种方式突出显示时,是否可以使其支持HTML / HTML安全? 我希望突出显示应用于HTML文档中的文本,而不是突出显示与搜索匹配的任何HTML标