java 多态性使用超类变量创建新的子类对象
java polymorphism creating a new subclass object using a superclass variable
我想根据对象创建一个新实例,其中我有超级 class 变量。如果不实现 getNew() 函数或不使用丑陋的 if 链,这是否可能以某种方式实现?
也就是说:如何在不使用getNew()函数的情况下实现下面的newSubClass(..)函数?
public abstract class SuperClass {
abstract public SuperClass getNew();
}
public class SubClassA extends SuperClass {
@Override
public SuperClass getNew() {
return new SubClassA();
}
}
public class SubClassB extends SuperClass {
@Override
public SuperClass getNew() {
return new SubClassB();
}
}
private SuperClass newSubClass(SuperClass superClass) {
return superClass.getNew();
}
看看 "FactoryMethod" 设计模式。
这正是您要查找的内容:它确实封装了 "new" 运算符。
但是你的例子让我想知道:
- 您的 getNew() 重新实现了构造函数无论如何都会做的事情
尝试这样的事情:
public abstract class SuperClass {
public SuperClass createSuperClass(object someParam) {
if (someParem == a) return new SubClassA();
if (someParem == b) return new SubClassB();
}
}
public class SubClassA extends SuperClass {
}
public class SubClassB extends SuperClass {
}
如您所见,您在某个地方需要一些 IF ...
在考虑了一些时间和 zv3dh 的贡献之后,我决定了第二个答案。
我现在知道你想要一个超类的子类类型的实例的新实例,而不知道运行时的具体子类型。
为此你有 "reflexion".
public abstract class A_SuperClass {
public A_SuperClass createNewFromSubclassType(A_SuperClass toCreateNewFrom) {
A_SuperClass result = null;
if (toCreateNewFrom != null) {
result = toCreateNewFrom.getClass().newInstance();
}
// just an example, add try .. catch and further detailed checks
return result;
}
}
public class SubClassA extends A_SuperClass {
}
public class SubClassB extends A_SuperClass {
}
如果您搜索 "java reflexion",您将在 SO 和网络上获得很多结果。
我想根据对象创建一个新实例,其中我有超级 class 变量。如果不实现 getNew() 函数或不使用丑陋的 if 链,这是否可能以某种方式实现? 也就是说:如何在不使用getNew()函数的情况下实现下面的newSubClass(..)函数?
public abstract class SuperClass {
abstract public SuperClass getNew();
}
public class SubClassA extends SuperClass {
@Override
public SuperClass getNew() {
return new SubClassA();
}
}
public class SubClassB extends SuperClass {
@Override
public SuperClass getNew() {
return new SubClassB();
}
}
private SuperClass newSubClass(SuperClass superClass) {
return superClass.getNew();
}
看看 "FactoryMethod" 设计模式。
这正是您要查找的内容:它确实封装了 "new" 运算符。
但是你的例子让我想知道:
- 您的 getNew() 重新实现了构造函数无论如何都会做的事情
尝试这样的事情:
public abstract class SuperClass {
public SuperClass createSuperClass(object someParam) {
if (someParem == a) return new SubClassA();
if (someParem == b) return new SubClassB();
}
}
public class SubClassA extends SuperClass {
}
public class SubClassB extends SuperClass {
}
如您所见,您在某个地方需要一些 IF ...
在考虑了一些时间和 zv3dh 的贡献之后,我决定了第二个答案。
我现在知道你想要一个超类的子类类型的实例的新实例,而不知道运行时的具体子类型。
为此你有 "reflexion".
public abstract class A_SuperClass {
public A_SuperClass createNewFromSubclassType(A_SuperClass toCreateNewFrom) {
A_SuperClass result = null;
if (toCreateNewFrom != null) {
result = toCreateNewFrom.getClass().newInstance();
}
// just an example, add try .. catch and further detailed checks
return result;
}
}
public class SubClassA extends A_SuperClass {
}
public class SubClassB extends A_SuperClass {
}
如果您搜索 "java reflexion",您将在 SO 和网络上获得很多结果。