Java 当父类没有实现接口时,在父类中实现接口的方法有什么风险?
假设我有这个接口和这些类:Java 当父类没有实现接口时,在父类中实现接口的方法有什么风险?,java,oop,interface,implementation,Java,Oop,Interface,Implementation,假设我有这个接口和这些类: public interface ITest { void test(); } public class Parent { public void test() { System.out.println("test"); } } public class Child extends Parent implements ITest { } 现在我知道项目将编译,但是这个模式在运行时是否有产生错误的风险
public interface ITest
{
void test();
}
public class Parent
{
public void test()
{
System.out.println("test");
}
}
public class Child extends Parent implements ITest
{
}
现在我知道项目将编译,但是这个模式在运行时是否有产生错误的风险
我这样问是因为我需要使用一个已经存在于实现接口的类的父类中的方法。编辑父类和子类所在的项目应该是最后的解决方案,因为它不会向后兼容。版本方面
它似乎也能工作,但它违背了我对OOP的理解。如果我可以使用这种模式而不冒任何风险的话,我的生活实际上会轻松得多。假设你不混合来自不同编译运行的类文件,在这一点上,一切都是不可能的;显然,您无法防止有人同时更改父级和ITest,只重新编译这两个,而不更改编译Child Child.class的早期编译结果,这里没有风险。假设您不混合来自不同编译运行的类文件,那么一切都是不可能的;显然,您无法防止有人同时更改父项和ITest,只重新编译这两个项,而不更改编译Child.class的早期编译结果,这里没有风险。这种模式是完全可以接受的,没有问题 当一个类实现一个接口时,Java编译器只需检查接口中声明的方法的存在性/兼容性;实施的方式和来源并不重要
然而,这种做法可能会让读者感到困惑,因此我建议写一篇好的评论,解释为什么会这样做。这种模式是完全可以接受的,没有任何问题 当一个类实现一个接口时,Java编译器只需检查接口中声明的方法的存在性/兼容性;实施的方式和来源并不重要
但是,这种做法可能会让读者感到困惑,因此我建议写一篇好的评论,解释为什么会这样做。如果您计划将Child实例传递为ITest类型,那么风险在于您可能会违反Liskov替换原则。如前所述,语法上没有问题;但父级中的测试方法实现的语义是否和ITest中的测试方法声明的语义一致
例如,如果测试声明的含义类似,则执行foo测试,如果失败则抛出运行时异常;但该实现的意义是,执行bar测试并打印一条消息,如果测试失败,则作为ITest实例的Child使用者可能会被破坏,即使它已编译。如果您计划将Child实例作为ITest类型传递,则风险在于您可能违反Liskov替换原则。如前所述,语法上没有问题;但父级中的测试方法实现的语义是否和ITest中的测试方法声明的语义一致
例如,如果测试声明的含义类似,则执行foo测试,如果失败则抛出运行时异常;但实现的意义是,执行bar测试并打印一条消息,如果失败,则作为ITest实例的Child的使用者可能会被破坏,即使它已编译。我猜风险在于有人在不了解需求的情况下更改了父项,孩子们会崩溃。这种风险与编程中的任何其他风险都没有什么区别。如果有人做出了突破性的改变,构建就会中断,需要修复。这种继承结构可能是不常见的情况,但它本身并没有什么问题。为什么编辑父级以实现ITest不向后兼容?@jaco0646因为父级所在的项目是版本连接的,并且使用该项目的应用程序必须支持该项目的所有版本。因此,在代码更改之前使用旧版本去序列化的应用实体实例将不会使用新的实现。我猜风险在于有人在不了解需求的情况下更改父级,而子级则会中断。这种风险实际上与编程中的任何其他风险没有任何区别。如果有人做出了突破性的改变,构建就会中断,需要修复。这种继承结构可能是不常见的情况,但它本身并没有什么问题。为什么编辑父级以实现ITest不向后兼容?@jaco0646因为父级所在的项目是版本连接的,并且使用该项目的应用程序必须支持该项目的所有版本。因此,在代码更改之前使用旧版本去序列化的应用程序实体实例不会使用新的实现。是的
它实际上只是父类中包含的属性的getter。是的,它实际上只是父类中包含的属性的getter。因为父类在它自己的项目中,并且是版本连接的,所以没有风险。子类所在的项目引用父项目Maven及其版本。这两个项目都是通过管道构建/编译/部署的,所以如果编译失败,我会立即得到通知。谢谢因为父类位于它自己的项目中,并且是版本连接的,所以没有风险。子类所在的项目引用父项目Maven及其版本。这两个项目都是通过管道构建/编译/部署的,所以如果编译失败,我会立即得到通知。谢谢