java - 从超类构造函数获取子类
问题描述
我有一个做东西的 X 类。可以有多种 X。通常我只会为每种类型创建一个子类,但是我无法更改程序的一部分,它使用 X 构造函数声明和实例化 X。除了构造函数签名之外,我对 X 有完全的控制权。(由我无法更改的程序部分调用)
我想过为每种类型创建一个 Xcontroller,其中包含我想要覆盖的方法并存储在 X 中。有些方法需要使用 X 的超级方法,除非我弄错了,否则我不能从另一个类中调用它们。
示例代码:
class cantTouchThis{
public static void main(String[] args){
// Can't change this
X x = new X("obligatory parameter");
doThings(x);
}
private static void doThings(X x){
// do stuff with X
}
}
enum Type{
A, B, C;
public static Type iKnowHowToGetTheTypeTrustMe(){
// Always return the good type for the instance
}
}
class X extends SuperClass {
public X(String string){
Type type = Type.iKnowHowToGetTheTypeTrustMe();
}
public void a(Object one, Object two){
switch(type){
case A:
super.a(one, two);
return;
case B:
doOtherThings(one, two);
return;
case C:
super.a(two, one);
return;
}
}
private void doOtherThigns(Object one, Object two){
// stuff
}
}
我宁愿将类型设为自己的类(A 类扩展 X,B 类扩展 X,C 类扩展 X)。但是我必须使用 cantTouchThis 中的代码,它总是声明一个 X 并使用 X 构造函数进行实例化。X 类有大量的 switch case,以及许多仅用于某些类型的实例变量,其余时间无用。
有没有办法让 X 构造函数改变它自己的类型并成为它的子类之一?
解决方案
您可以使用委托。像这样的东西:
class X extends SuperClass {
private final SuperClass delegate;
public X(String string){
Type type = Type.iKnowHowToGetTheTypeTrustMe();
switch(type) {
case A:
delegate = new AX(string);
break;
case B:
delegate = new BX(string);
break;
// and so on...
}
}
public void a(Object one, Object two) {
delegate.a(one,two);
}
}
然后在 AX, BX, CX 中实现一个你喜欢的。
推荐阅读
- python - No such file or directory while using os.rename
- excel - excel 文件 (.xlms) 继续加载但未打开。但是,在加载它时,它会打开,如果单击另一个 excel 文件以打开它
- java - Deserializing a list of JSON objects having object's ID as an object name
- swift - Bind uitextfield value to viewModel using mvvm
- c++ - C++17 copy constructor, deep copy on std::unordered_map
- amazon-web-services - 无法在新的 AWS EMR 集群中获取 SparkContext
- python - How do I add an element to numpy nd array?
- javascript - How to throw error in node js and catch it mocha
- spring - 名称为“configServicePropertySource”的 bean 定义无效
- angular - 使用键盘事件导航列表