指定在程序运行时将创建的对象类型

时间:2011-09-30 22:04:46

标签: java inheritance

我有一组java子类,它们都扩展了相同的超类。它们包含完全相同的方法,并对不同类型的输入数据进行相同的计算。这意味着一个负责处理int,另一个负责处理double,另一个负责处理int Array,List等。每种类型的对象应该在程序的运行时根据输入数据每次创建。

在程序运行时,每次指定创建哪种对象(引用的子类)的最佳方法是什么?似乎不可能使用类型检查之类的东西,因为数据可能是不同类型(类)。

我是否需要一个专门负责此任务的单独类,用作对象生成器?如果是这样,是否有关于这类课程的形式和功能的提示?

谢谢。

3 个答案:

答案 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();
    }
}