【发布时间】:2019-02-04 17:57:03
【问题描述】:
我一直在研究 java 设计模式以使我的项目更有条理,我需要知道的一件事是,如果以下方法是好的做法。
当使用父抽象类或接口时,子类的方法在父类中定义。
我的问题是,当我有一堆子类时,如果每个子类都覆盖父类中的方法 A,但其中一个子类需要有不同的方法 B,那么在父类中定义方法 B 是否是一种好习惯,即使它仅用于该单个子类。
这带来了一个问题,即 methodB 将需要在每个子类中使用,即使它从未从该类中调用。
我打算这样做吗?好像不太对。
代码示例:
public interface Parent{
public void methodA();
//Should this method be in the parent as it is only used once?
public void methodB();
}
子类:
public class First implements Parent{
@Override
public void methodA(){
System.out.println("This is method A");
}
// Does Nothing but java must have it used in the sub class
@Override
public void methodB(){
throw new UnsupportedOperationException("Do not call methodB from class First!!");
}
}
public class Second implements Parent{
@Override
public void methodA(){
System.out.println("This is method A");
}
// methodB is being used for this sub-class
@Override
public void methodB(){
System.out.println("This is method B");
}
}
从上面的代码可以看出,我只对第二个子类使用了methodB,但是还是要求在第一个子类中使用,否则会抛出异常。由于永远不应该在第一个类中调用此方法,因此我只需抛出一个带有消息的异常。这似乎没有组织。这绝对是错误使用继承。
如果我只在 Second 类中使用 methodB,而不将其添加到父类中:
public static void main(String[] args) {
Parent p = new Second();
p.methodA() // Prints "This is method A"
p.methodB() // throws an error
}
有谁知道我如何调用类中的特定方法而不会引发错误。将方法添加到父级绝对是不好的做法。
编辑:
感谢所有快速响应,我发现这样做的方法是定义不同的接口:
interface X {
public void A()
}
interface Y extends X {
public void B()
}
class First implements X {
@Override
public void A();
}
class Second implements Y {
@Override
public void A();
@Override
public void B();
}
如果这仍然不正确,请告诉我。
【问题讨论】:
-
我猜这违反了Liskov substitution principle。如果某些东西实际上不是更精致或更专业的子类型,则不应使用继承,并且如果这实际上不是所有子项的行为,则绝对不应将方法(即行为)放入父项中。重新考虑这些课程。 (另见en.wikipedia.org/wiki/Circle-ellipse_problem)
-
如果仅在单个子类中使用“不同的方法 B”,它是什么意思?如果它只在一个子类中,并且无论如何您都在覆盖方法 A,那么谁在乎方法中的内容是什么?如果子类不需要方法 B,为什么它会在父类中?
-
如果其中一个子类需要方法 B,那么在我看来,方法 B 是该子类的私有方法,否则该子类并不是接口的真正实例。
-
应该
First和Second实现Parent吗?如果是这样,请写下来。 -
在您删除之前,我设法在 cmets 中向我阅读了您的问题,并尝试回答(更新)
标签: java inheritance interface polymorphism abstract-class