java - 是否可以创建一个“超级”变量,然后将其更改为子类类型并能够访问子类方法
问题描述
我想要的是能够使用超类创建一个变量,然后稍后将其“转换”为子类并能够访问子类方法。它总是被定义为一个子类,我只是在定义时不知道是哪个子类。
class SuperClass {
//superclass methods
}
class SubClass1 extends SuperClass {
void subClass1method() {
//do something
}
}
class SubClass2 extends SuperClass {
void subClass2method() {
//do something different
}
}
class Main {
public static void main ( String [] args ) {
SuperClass a;
if (*some reson to be SubClass1*) {
a = new SubClass1();
a.subClass1Method(); //this is undefined it says
//a instanceof SubClass1 returns true which is what confused me
} else {
a = new SubClass2();
a.subClass2Method(); //this is undefined it says
}
}
}
我不是在问它为什么这样做,而是在问解决它并获得我想要的结果的正确方法。
我一直在寻找重复的,但很容易错过一个,所以请告诉我。
解决方案
当您无法控制源时,除了强制转换(或可能使用适配器)之外,您无能为力。如果instanceof
你的课程听起来很熟悉,那么这可能就是你的教授所期望的。
以下是您的一些选择:
// to execute those subclass specific methods without casting..
public static void main ( String [] args ) {
SuperClass superClass;
if (true /*some reson to be SubClass1*/) {
SubClass1 subClass1 = new SubClass1();
subClass1.subClass1Method();
superClass = subClass1;
} else {
SubClass2 subClass2 = new SubClass2();
subClass2.subClass2Method();
superClass = subClass2;
}
// ... ...
}
// using instanceof and casting
public static void main ( String [] args ) {
SuperClass superClass;
if (true /*some reson to be SubClass1*/) {
superClass = new SubClass1();
} else {
superClass = new SubClass2();
}
// ... ... ...
if(superClass instanceof SubClass1) {
((SubClass1) superClass).subClass1Method();
} else if(superClass instanceof SubClass2) {
((SubClass2) superClass).subClass2Method();
}
}
以下是我的建议,以在您控制源代码时实现此目标。
您可以使用组合来为一个类提供不同的行为,而不是为不同的行为创建一个新类。请注意,如果您了解功能接口和方法引用,这将特别方便。
public class SuperClass {
private MyBehavior behavior;
public void setBehavior(MyBehavior behavior) { this.behavior = behavior; }
public void doBehavior() { this.behavior.doBehavior(); }
}
public interface MyBehavior { public void doBehavior(); }
public class MyGoodBehavior implements MyBehavior {
@Override public void doBehavior() { System.out.print("good behavior"); }
}
public class MyBadBehavior implements MyBehavior {
@Override public void doBehavior() { System.out.print("bad behavior"); }
}
public static void main(String[] args) {
SuperClass a = new SuperClass();
a.setBehavior(new MyBadBehavior());
a.doBehavior();
}
推荐阅读
- python - 仅针对一个 url 端点在单线程中运行 django 服务器
- ionic-framework - 是否可以将 TailwindCSS 添加到 Ionic React 中?
- c++ - 如何在 MFC 的 CEDIT 矩形中找到特定字体大小的字符串的最大长度?
- python-3.x - 确保 pandas 中的每个组都有相同的产品
- javascript - 如何使用 BehaviourSubject 将数据传递给另一个模块组件
- r - 缺少 RODBC 1.3-16
- jquery - .Net Core MVC - TempData 不在 AJAX 调用中本地保存数据
- python - 将绘图添加到演示文稿中而不将其保存为图像
- python - 数组中的多个值都是最高的。我如何识别它们?
- flutter - Flutter pwa app 未检测到服务人员