我有一组java子类,它们都扩展了相同的超类。它们包含完全相同的方法,并对不同类型的输入数据进行相同的计算。这意味着一个负责处理int,另一个负责处理double,另一个负责处理int Array,List等。每种类型的对象应该在程序的运行时根据输入数据每次创建。
在程序运行时,每次指定创建哪种对象(引用的子类)的最佳方法是什么?似乎不可能使用类型检查之类的东西,因为数据可能是不同类型(类)。
我是否需要一个专门负责此任务的单独类,用作对象生成器?如果是这样,是否有关于这类课程的形式和功能的提示?
谢谢。
答案 0 :(得分:0)
我不确定我是否理解你的问题,因为它不是很清楚,你班级的一些例子以及你想要完成的事情会有所帮助。
无论如何,我从中获得的是你应该检查访客模式。 http://en.wikipedia.org/wiki/Visitor_pattern
简单来说,我会将您想要对每种类型执行的操作分开,并为每一种类型分配一个类(而不是将所有这些作为所有子类中的方法)。
你会做那样的事情:
yourSubclass.accept(yourAction)
访问方法将在访问者界面上定义,每种类型的子类都有一次。每个动作类都必须实现为每个动作类做的事情。在你的超类中,accept方法只会从操作中调用visit。
如果这不是你问的那个,抱歉:)
答案 1 :(得分:0)
以下是“sum”的示例。单个数字的总和就是那个数字。它们的集合总和是该集合中所有数字的总和。
interface Summable {
double sum();
}
class IntegerSum implements Summable {
int i;
IntegerSum(int i) { this.i = i; }
public double sum() { return (double)i; }
}
class DoubleSum implements Summable {
double d;
DoubleSum(double d) { this.d = d; }
public double sum() { return d; }
}
class ListSum<? extends Number> implements Summable {
List<? extends Number> list;
ListSum(List<? extends Number> list) { this.list = list; }
public double sum() {
double d = 0;
for(Number n : list) d += n;
return d;
}
}
现在您只需要一个FACTORY
方法:
class SummableFactory {
public static Summable summableFor(double d) { return new DoubleSum(d); }
public static Summable summableFor(int i) { return new IntegerSum(i); }
public static Summable summableFor(List<? extends Number> list) { return new ListSum(list); }
private SummableFactory() { }
}
答案 2 :(得分:0)
可能是一家工厂:
abstract class Super {
abstract void foo();
}
class I extends Super {
void foo() {
System.out.println(this);
}
}
class D extends Super {
void foo() {
System.out.println(this);
}
}
class Factory {
static Super create(Class clazz) {
if(clazz.equals(Integer.class))
return new I();
else if(clazz.equals(Double.class))
return new D();
else return null;
}
}
public class Main {
public static void main(String[] args) {
Factory.create(Integer.class).foo();
Factory.create(Double.class).foo();
}
}