Укажите, какой тип объекта будет создан во время выполнения программы - PullRequest
0 голосов
/ 01 октября 2011

У меня есть набор Java-подклассов, которые расширяют один и тот же суперкласс.Они содержат одинаковые методы и выполняют одинаковые вычисления для входных данных разного типа.Это означает, что один отвечает за работу с int, другой с double, другой с int Array, List и т. Д. Объекты каждого типа должны создаваться во время выполнения программы в соответствии с входными данными каждый раз.

Как лучше всего указать, какой тип объекта (из упомянутых подклассов) будет создаваться каждый раз во время работы программы?Кажется невозможным использовать что-то вроде проверки типов, поскольку данные могут быть другого типа (класса).

Нужен ли отдельный класс, который отвечает исключительно за эту задачу, что-то, что служит генератором объектов?Если да, есть ли подсказка о том, какова будет форма и функциональность такого класса?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 01 октября 2011

Вот пример с «суммой».Сумма одного числа - это просто число.Сумма их коллекции - это сумма всех чисел в этой коллекции.

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() { } 
}
0 голосов
/ 01 октября 2011

может быть, завод, как:

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();
    }
}
0 голосов
/ 01 октября 2011

Я не уверен, что правильно понял ваш вопрос, так как он не очень понятен, некоторые примеры вашего класса и того, что вы пытаетесь достичь, помогут.

В любом случае, я понял, что вы должны проверить шаблон посетителя. http://en.wikipedia.org/wiki/Visitor_pattern

Проще говоря, я бы разделил действия, которые вы хотите выполнить с каждым типом, и имел бы один класс для каждого из них (вместо того, чтобы использовать все эти методы как методы во всех ваших подклассах).

И вы бы сделали что-то подобное:

yourSubclass.accept(yourAction)

Метод посещения будет определен в интерфейсе Visitor, один раз для каждого типа вашего подкласса. И каждый из ваших классов действий должен будет реализовать, что делать для каждого из них. И метод accept в вашем суперклассе просто вызовет визит из действия.

Если это не то, что вы спросили, извините:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...