【问题标题】:Letting superclass's methods be implemented by an inherited class让超类的方法由继承的类实现
【发布时间】:2017-07-09 15:41:12
【问题描述】:

假设我的代码有这样的结构:

public abstract class A{ 
    public abstract Foo methodX();
    public abstract Bar methodY();
}

public class B extends A {
    public Foo methodX(){
        // stuff
    }
    public Bar methodY(){
        // more stuff
    }
}

public class C extends A {
    public Foo methodX() {
        // stuff
    }
    public Bar methodY(){
        // What to do?
    }
}

public class D extends C {
    public Bar methodY() {
        // do stuff
    }
}

public class F extends C {
    public Bar methodY() {
        // do different stuff
    }
}

我这样做的原因是因为我有多个classes 扩展A,都有公共方法methodX()methodY(),我有多个classes 扩展B 都有一些B的共同属性,但需要有不同的处理方式methodY()和不同的equals/hashcode.

那么,我怎样才能让B 实现唯一的methodX(),但让C 和D 实现methodY() 而不返回null 或在methodY() 中为B 不做任何事情?

【问题讨论】:

  • A是唯一的抽象类吗?
  • 是的,我需要能够初始化其余的类
  • 关键是一个类不能在不知道它的所有方法会做什么的情况下被实例化。是否由(非抽象)超级方法、匿名类等提供。

标签: java inheritance methods code-structure


【解决方案1】:

你需要将B类声明为抽象类

public abstract class B extends A{
    public Foo medhodX(){
        // stuff
    }
}

通过声明类抽象,您允许他不实现所有抽象方法(来自超类或实现的接口)。所以你可以只实现一个抽象方法并强制子类实现所有剩余的抽象方法。

【讨论】:

  • 如果我还需要启动/创建B类怎么办?
  • 您希望在这种情况下的行为是什么?由于您没有提供methodY() 的实现
  • 你不能实例化抽象类,因为它不能完全发挥作用(它不“知道”如果有人调用methodY该怎么办)。
  • @Valentin 我想要它用于搜索和插入算法,我正在搜索 B 类或 C 类的子类并根据情况调用 methodY()。
  • @ShubhamPatel 我认为您应该问另一个问题,在那里您可以准确地扩展您想要做什么,因为它似乎对我来说不够具体
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2019-03-23
  • 2011-10-17
相关资源
最近更新 更多