【问题标题】:Can you call a method in the SuperClass from a separate class that has the SubClass of said SuperClass as an object?你可以从一个单独的类中调用 SuperClass 中的方法,该类具有所述 SuperClass 的子类作为对象吗?
【发布时间】:2017-12-29 19:16:56
【问题描述】:

这个 SubClass 已经覆盖了原来的方法并且 SuperClass 是一个抽象类。是否可以通过初始化为其子类的对象调用超类中的原始方法?

public class SubClass extends SuperClass {
    public void methodA() {
        System.out.println("SubClass: methodA");
    }

    public void methodB(int num) {
        System.out.println("SubClass: methodB " + ++num);
    }
}

public abstract class SuperClass {
    public void methodA() {
        System.out.println("SuperClass: methodA");
    }

    public void methodB(int num) {
        System.out.println("SuperClass: methodB " + num);
    }
}

我想做什么:

{
  public static void main(String args[]){
    SuperClass sup= new SuperClass();
    sup.methodA();
}

我认识到上面的代码不能作为抽象类工作,不能实例化,所以我试图这样做:

{public static void main(String args[]){
    SuperClass sup= new SubClass();
    sup.methodA(); //Trying to call method in original superclass
}

【问题讨论】:

  • 你应该发布一个代码示例而不是试图用文字来描述它。
  • 您没有包括您实际尝试做您询问的事情的部分。只是一个示例超/子类并没有做任何事情。
  • 不,你不能那样做——这会使覆盖方法的概念失效。
  • 我注意到你的问题仍然是“开放的”——因为你没有接受答案。请查看并决定是否要accept 回答。或者让我知道我是否可以做些什么来增强我的输入以使其被接受。接受有助于未来的读者确定问题是否已解决,并对花时间回答你的人表示感谢。谢谢!

标签: java inheritance abstract-class


【解决方案1】:

您始终可以创建扩展 Super 的匿名类或不会覆盖 methodA() 的子类。 以下是前一种方法的示例:

    SuperClass sup= new SuperClass(){};
    sup.methodA();

【讨论】:

  • 我同意这解决了“即时”问题。但这仍然是错误的方法。但我仍然对务实的方法投了票。
【解决方案2】:

不,你不能“从外部”这样做。

这就是多态性的全部目的/思想——调用的确切方法完全取决于调用该方法的对象的类。

换句话说:您必须退后一步并修复您的设计。如果你想调用基类方法,那么你需要一个基类对象——而不是子类对象!

含义:没有简单的解决方法。相反,您应该仔细审查您的需求,然后提出一个类层次结构来帮助您实现这些需求。

我同意 tsolakp 概述的解决方案会起作用 - 但请不要误会:它只不过是修复症状的(脏)创可贴。您最好将时间花在修复损坏的 oo 设计的根本原因上。

【讨论】:

  • 这取决于使用情况。我在单元测试中使用了我认为可以接受的匿名方法。
  • 如前所述 - 如果我不相信你的回答有一定的价值,我就不会投票给它。
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
相关资源
最近更新 更多