当父 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 替换原则。如前所述,语法上没有问题;但是 Parent
中 test()
方法实现的语义是否符合 ITest
中 test()
方法声明的语义?
比如测试声明的意思是这样的,执行一个foo的测试,失败则抛出运行时异常;但实现的意思是,执行 bar 的测试并在失败时打印一条消息,然后作为 ITest
实例的 Child
的消费者很可能被破坏(即使它编译) .
假设我有这个界面和这些 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 替换原则。如前所述,语法上没有问题;但是 Parent
中 test()
方法实现的语义是否符合 ITest
中 test()
方法声明的语义?
比如测试声明的意思是这样的,执行一个foo的测试,失败则抛出运行时异常;但实现的意思是,执行 bar 的测试并在失败时打印一条消息,然后作为 ITest
实例的 Child
的消费者很可能被破坏(即使它编译) .