java - 向类添加方法而不破坏实现

标签 java design-patterns design-principles

假设我有 2 个类,分别为 class Cowclass Pig

它们都实现了接口(interface) Animal

对于接口(interface),只有 2 个方法,分别为 public void eat()public void talk()

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

所以我想到,除了interface之外,我还会使用abstract类,如果需要添加新方法的话)在未来。

例如,public class Cow extends ...implements Animal

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

但问题是,如果这些类扩展已经是其他类了怎么办?在这种情况下,我无法扩展 2 个类(class)。

所以我的问题是:

Is there a pattern where I could declare a common interface of related classes while withholding the ability to add new methods in the future that doesn't break the "closed-open principle" and doesn't break implementations?

最佳答案

Java 8 有 default methods

public interface Animal {

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

}

现在,您的Animal必须覆盖eatspeak,但可以选择覆盖sleep

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

附注不要声明 interface 方法 public,这是所有 interface 成员的默认可见性。

关于java - 向类添加方法而不破坏实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24228650/

相关文章:

java - 问题 28 - 更多平方根 - 简单的任务,但我不知道为什么我错了

java - 是否可以动态更新 JTextArea?

java - 使用 maven-assembly-plugin 包含所需的驱动程序时未找到合适的驱动程序

oop - 这个反模式的名字是什么?方法签名是个骗子

python - 在 Python 中动态添加属性不受欢迎吗?

java - 重新打包 Spring Boot 应用程序

c# - 结合 ORM、工作单元和存储库模式的主从 View

c# - WPF按钮命令模式:Interpret to UML diagram to show actors

c# - 创建DTO时如何避免冗余的业务逻辑(DB fetching)?

oop - 面向对象的原则应该应用在过程语言中吗?