【问题标题】:Using an overridden method from an abstract class (Java)使用抽象类中的重写方法 (Java)
【发布时间】:2021-03-13 02:31:47
【问题描述】:

我有三个类,一个超类、一个子类和一个测试类。 SuperClass 是抽象的,SubClass 是 SuperClass 的扩展,测试类与它们中的任何一个都没有关系。 所以

public abstract class SuperClass {...}
public class SubClass extends SuperClass {...}
public class TesterClass {...}

SuperClass 和 SubClass 都有一个 toString() 方法,所以看起来更像

public abstract class SuperClass {
    public String toString(){...};
    ...
}
public class SubClass extends SuperClass {
    public String toString(){...};
    ...
}
public class TesterClass {...}

我需要做的是在测试器类中使用 SuperClass 的 toString() 方法。我尝试将子类和对象从子类转换为超类并使用那里的方法,但最终使用子类中的 toString() 方法。 (在我尝试使用一点反射来查看 Java 认为该对象是哪个类之后,即使在强制转换之后,它看起来也认为它仍然是子类)。我曾想过尝试使用反射直接从 SuperClass 中获取我想要的方法,然后使用 invoke() 调用对象,但这似乎是一个非常混乱的解决方案。

任何帮助都会有很大帮助,即使它只是将我指向一个我还没有听说过的概念。谢谢!

【问题讨论】:

    标签: java oop inheritance reflection abstract-class


    【解决方案1】:

    TesterClass 类中,您可以创建一个扩展抽象SuperClass 的类,然后测试该子类的toString。因为,您没有覆盖该子类的 toString,所以当您调用它的 toString 时,您实际上将测试超类中的 toString,(ie, SuperClass

    或者,您可以在您的测试方法中 1) 创建一个 SuperClass 类型的内部匿名类; 2) 实现它的抽象方法(只是忽略它们,因为它们不会被测试)。 3)测试内部匿名类的toString

    public class TesterClass {
    
         void test_super_class_to_String(){
              SuperClass myApp = new SuperClass() {
                    @Override
                    void do_something() {}
                };
           String str = myApp.toString();
           // assert str == ....
        }
    }
    

    SuperClass 如下所示

    public abstract class SuperClass {
        abstract void do_something();
    
        public String toString(){  return ...;}
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2011-12-26
      • 2018-07-12
      相关资源
      最近更新 更多