当父 class 不实现接口时,在父 class 中实现接口的方法有什么风险?

What are the risks of having the method implementation of an interface in a parent class when the parent class does not implement the interface?

假设我有这个界面和这些 classes:

public interface ITest 
{
   void test();
}

public class Parent
{
   public void test()
   {
       System.out.println("test");
   }
}

public class Child extends Parent implements ITest
{

}

现在我知道项目可以编译了,但是这个模式是否有在运行时产生错误的风险?

我问是因为我需要使用实现该接口的 class 的父级中已经存在的方法。编辑 Parent 和 Child classes 所在的项目应该是最后的解决方案,因为它不会向后兼容。 (版本明智)

它似乎也有效,但它违背了我对 OOP 的理解。如果我可以毫无风险地使用这种模式,它实际上会让我的生活变得更轻松。

假设您不混合来自不同编译运行的 class 文件(此时,一切 都在 window 之外;您显然无法保护反对同时更改 Parent 和 ITest 的人,只重新编译这两个,并保留您之前编译 Child (Child.class) 的编译结果不变),这里没有风险。

这个模式完全可以接受,没有任何问题。

当 class implements 接口时,Java 编译器只检查接口中声明的 presence/compatibility 方法;实现的方式和来源并不重要。

但是,这种做法可能会让 reader 感到困惑,所以我建议写一篇很好的评论,解释为什么要这样做。

如果您计划将 Child 的实例作为类型 ITest 传递,那么您可能会违反 Liskov 替换原则。如前所述,语法上没有问题;但是 Parenttest() 方法实现的语义是否符合 ITesttest() 方法声明的语义?

比如测试声明的意思是这样的,执行一个foo的测试,失败则抛出运行时异常;但实现的意思是,执行 bar 的测试并在失败时打印一条消息,然后作为 ITest 实例的 Child 的消费者很可能被破坏(即使它编译) .