如果 subclass 被引用为 super class,则调用方法的正确方法

Proper way of calling a method in a subclass if it's referenced as a super class

class SuperClass () {
  doSuperStuff();
}

class SubClass extends SuperClass () {
  doStuff();
}

SuperClass aClass = new SubClass();

为了调用方法 doStuff() 我需要像 (SubClass)aClass.doStuff(); 那样转换它吗?

  1. 通常是这样做的吗?
  2. 有没有更好的方法?
  3. 我是否应该 "always" 以这种方式初始化子类,以防我想放一堆 将 SuperClass 的子类转换成数组或类似的东西?

更新: 看了大家的回复:

好的。在我的理解中,我肯定遗漏了一些东西。我认为让子类继承超类的所有内容,然后在子类中再创建一个方法就可以了。那我应该做一个界面吗?

此外,我有 SuperClass class = new SubClass(); 但将其重命名为 SuperClass aClass = new SubClass();

  1. 您的代码实际上不会工作,但是转换是唯一的方法(但不要这样做)。你需要做的是((SubClass)class).doStuff();
  2. 没有。我建议甚至不要这样做
  3. 没有。如果您需要 SubClass,请将其声明为 SubClass。如果您有一个对象集合,它们都继承自 SuperClass,那么您 应该 调用的唯一方法是那些在 SuperClass 上定义的方法。做任何其他事情都会导致可怕的、像意大利面条一样无法维护的代码

如果 doStuff() 仅属于子类并且在超类中没有意义,那么此时您应该使用子类实例。

但是,如果 doStuff() 在超类的所有子类中都具有语义有效性,那么超类应该有一个在所有子类中实现的抽象方法 doStuff()

或者,如果 doStuff() 仅适用于某些子类,您可以使用该方法定义接口并让这些子类实现该接口。

您使用哪种方法取决于整体应用程序结构,您没有真正提供足够的信息让我们进一步指导您。

我认为这行可能无法编译

SuperClass class = new SubClass();

但是假设你有 SuperClass clazz = new SubClass();声明是在编译时完成的,方法的调用也是如此。因此,您只会看到在声明 clazz 的类型上声明的方法。所以是的,如果你需要调用子 class 方法,你需要对 clazz 执行适当的转换。

关于你的第二个问题:如果你想利用多态行为,这是正确的做事方式......这引出了你的第三个问题。是的,这是利用多态性的方法,在存储在集合或用基本类型

声明的数组中后,以统一的方式访问一堆子classes的行为
  • 首先,如果你想从子类中调用一个方法,首先你不必使用超类的数据类型来创建变量。你可以简单地:

    MySubClass obj1 = new MySubClass();
    

obj1 将能够从其超类(由于继承,超类中的私有方法除外)和自身访问这两种方法。

  • 其次,不能将变量命名为class

  • 第三,如果你想做一个铸造,它是这样的:

    MySuperClass obj2 = new MySubClass();
    ((MySubClass)obj2).doStuff();