[英]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 替换原则。 如前所述,语法上没有问题; 但是Parent
中test()
方法实现的语义是否符合ITest
中test()
方法声明的语义?
例如,如果测试声明的含义类似于,执行 foo 的测试,如果失败则抛出运行时异常; 但是实现的意思是,执行 bar 的测试并在失败时打印一条消息,那么作为ITest
实例的Child
的消费者很可能会被破坏(即使它编译)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.