如果 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();
那样转换它吗?
- 通常是这样做的吗?
- 有没有更好的方法?
- 我是否应该 "always" 以这种方式初始化子类,以防我想放一堆
将 SuperClass 的子类转换成数组或类似的东西?
更新:
看了大家的回复:
好的。在我的理解中,我肯定遗漏了一些东西。我认为让子类继承超类的所有内容,然后在子类中再创建一个方法就可以了。那我应该做一个界面吗?
此外,我有 SuperClass class = new SubClass();
但将其重命名为 SuperClass aClass = new SubClass();
- 您的代码实际上不会工作,但是转换是唯一的方法(但不要这样做)。你需要做的是
((SubClass)class).doStuff();
- 没有。我建议甚至不要这样做
- 没有。如果您需要
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();
class SuperClass () {
doSuperStuff();
}
class SubClass extends SuperClass () {
doStuff();
}
SuperClass aClass = new SubClass();
为了调用方法 doStuff()
我需要像 (SubClass)aClass.doStuff();
那样转换它吗?
- 通常是这样做的吗?
- 有没有更好的方法?
- 我是否应该 "always" 以这种方式初始化子类,以防我想放一堆 将 SuperClass 的子类转换成数组或类似的东西?
更新: 看了大家的回复:
好的。在我的理解中,我肯定遗漏了一些东西。我认为让子类继承超类的所有内容,然后在子类中再创建一个方法就可以了。那我应该做一个界面吗?
此外,我有 SuperClass class = new SubClass();
但将其重命名为 SuperClass aClass = new SubClass();
- 您的代码实际上不会工作,但是转换是唯一的方法(但不要这样做)。你需要做的是
((SubClass)class).doStuff();
- 没有。我建议甚至不要这样做
- 没有。如果您需要
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();