【问题标题】:Proper way of calling a method in a subclass if it's referenced as a super class如果子类被引用为超类,则在子类中调用方法的正确方法
【发布时间】:2016-02-01 21:03:58
【问题描述】:
class SuperClass () {
  doSuperStuff();
}

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

SuperClass aClass = new SubClass();

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

  1. 通常是这样做的吗?
  2. 有没有更好的办法?
  3. 我是否应该“总是”以这种方式初始化 SubClass,以防我想放一堆 将 SuperClass 的子类放入数组或类似的东西中?

更新: 看完大家的回复:

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

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

【问题讨论】:

  • 如果你需要调用静态类型为SuperClass的东西的SubClass方法,那么你的设计出了问题。
  • 如果要调用子类中的方法,为什么要引用它作为超类,SubClass class= new SubClass(),然后是class.doStuff()
  • @svasa 你不能调用变量class 这是一个保留字
  • 我只是引用上面发布的代码中的行。
  • @tazboy 我实际上赞成你的问题,因为我认为这是一个有效的问题。

标签: java subclass superclass


【解决方案1】:
  • 首先,如果您想从子类调用方法,首先您不必使用超类的数据类型来创建变量。你可以简单地:

    MySubClass obj1 = new MySubClass();
    

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

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

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

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

【讨论】:

  • 响应您的第一个反馈,我想我只是想扩大我的范围,以防以后想改变。
  • @tazboy 如果出于任何正当理由您正在执行第 1 点,那么您可以使用第 3 点对其进行向下转换以访问子类的方法。
【解决方案2】:
  1. 您的代码实际上不会工作,但是强制转换是唯一的方法(但不要)。你需要做的是((SubClass)class).doStuff();
  2. 没有。我什至不建议这样做
  3. 没有。如果您需要SubClass,请将其声明为SubClass。如果您有一个全部继承自 SuperClass 的对象集合,那么您应该调用的唯一方法是那些在 SuperClass 上定义的方法。做任何其他事情都会导致可怕的意大利面条式无法维护的代码

【讨论】:

  • 该变量可能是超类的数组,因此将其创建为超类是完全可以接受的:animal[I] = new Dog();那么您以后可能需要使用像((Dog)animal[I]).bark(); 这样的子类方法当然您应该首先验证animal[I] 是Dog。
  • 这无疑表明你的设计存在问题。请参阅上面的第 3 点
【解决方案3】:

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

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

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

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

【讨论】:

  • 是否必须实现接口中定义的每个方法?
【解决方案4】:

我认为这行可能不会编译

SuperClass class = new SubClass();

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

关于您的第二个问题:如果您想利用多态行为,这是做事的正确方法......这将我们引向您的第三个问题。是的,这是利用多态性的方法,在存储在集合或使用基类型声明的数组中后,以统一的方式访问一堆子类的行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 2015-04-23
    • 2011-10-24
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多