繁体   English   中英

当父 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?

假设我有这个接口和这些类:

public interface ITest 
{
   void test();
}

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

public class Child extends Parent implements ITest
{

}

现在我知道该项目会编译,但是这种模式在运行时会产生错误吗?

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

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

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

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

当 class implements接口时,Java 编译器只检查接口中声明的方法的存在/兼容性; 实施的方式和来源无关紧要。

但是,这种做法可能会让读者感到困惑,所以我建议写一个很好的评论来解释为什么要以这种方式完成。

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

例如,如果测试声明的含义类似于,执行 foo 的测试,如果失败则抛出运行时异常; 但是实现的意思是,执行 bar 的测试并在失败时打印一条消息,那么作为ITest实例的Child的消费者很可能会被破坏(即使它编译)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM