Изменить классы в Java - PullRequest
       20

Изменить классы в Java

1 голос
/ 04 февраля 2010

У меня есть класс ImageA и класс ImageB. Оба класса представляют изображение в моем приложении, но каждый по-своему. Даже будучи разными, их конструкторы равны, и оба имеют метод сравни .

Итак, я создал класс Image, а ImageA и ImageB являются подклассами Image.

public abstract class Image {
    protected String path;

    public Image(String path){
        this.path = path;
    }

    public abstract double compare(Image i2);
}


public class ImageA extends Image{...} 

public class ImageB extends Image{...}

Но мне нужно протестировать каждую реализацию изображения (в данном случае ImageA и ImageB), чтобы увидеть лучшую.

Есть ли способ сделать это, изменив мой код как минимум? Предположим, что используемые объекты принадлежат классу ImageA, и теперь я хочу протестировать класс imageB;

Обс .:

  • Если все объекты imageA моего приложения устанавливается по типу (ImageA я = новый ImageA ()), я должен был бы изменить вручную все в коде.

  • Но даже если я использую superType и брось это (Изображение я = (Изображение A) новый Изображение ()), у меня будет такая же проблема, поменять приведение.

  • Мой вопрос отличается от этого: Рефакторинг абстрактного Java-класса со многими дочерними классами . В моем случае атрибуты внутри дочерних классов различны, и я сохраняю атрибуты, общие для этих классов, в классе Image.

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

Если это вариант (возможно, я не получил вопрос), вы должны использовать шаблон фабричного метода , чтобы получить правильный конкретный класс. Образец пиццы говорит сам за себя:

abstract class Pizza {
    public abstract int getPrice(); // count the cents
}

class HamAndMushroomPizza extends Pizza {
    public int getPrice() {
        return 850;
    }
}

class DeluxePizza extends Pizza {
    public int getPrice() {
        return 1050;
    }
}

class HawaiianPizza extends Pizza {
    public int getPrice() {
        return 1150;
    }
}

class PizzaFactory {
    public enum PizzaType {
        HamMushroom,
        Deluxe,
        Hawaiian
    }

    public static Pizza createPizza(PizzaType pizzaType) {
        switch (pizzaType) {
            case HamMushroom:
                return new HamAndMushroomPizza();
            case Deluxe:
                return new DeluxePizza();
            case Hawaiian:
                return new HawaiianPizza();
        }
        throw new IllegalArgumentException("The pizza type " + pizzaType + " is not recognized.");
    }
}

class PizzaLover {
    /*
     * Create all available pizzas and print their prices
     */
    public static void main (String args[]) {
        for (PizzaFactory.PizzaType pizzaType : PizzaFactory.PizzaType.values()) {
            System.out.println("Price of " + pizzaType + " is " + PizzaFactory.createPizza(pizzaType).getPrice());
        }
    }
}

Output:
Price of HamMushroom is 850
Price of Deluxe is 1050
Price of Hawaiian is 1150
3 голосов
/ 04 февраля 2010

Вы можете создать фабрику и передать экземпляр вашей фабрики в тестовый класс, используя:

Image img = factory.newInstance(args);

по всему тестовому коду. Фабрика определяет, какой из типов ImageA или ImageB используется. Альтернативой было бы иметь abstract Image newInstance(args) в вашем Image классе и реализовать его в ваших подклассах. В этом случае вы бы добавили первый экземпляр изображения в ваши тестовые классы.

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

1 голос
/ 04 февраля 2010

Мне сложно понять ваш вопрос. Я постараюсь обобщить вашу формулировку проблемы, пожалуйста, прокомментируйте, если это действительно ваш вопрос.
(Я бы поставил это как комментарий, но количество символов превышает 600)

У вас есть классы ImageA и ImageB, которые являются подклассами Image Конструктор для обоих этих классов одинаков и принимает аргумент пути (я предполагаю, что это путь к файлу изображения) Классы ImageA и ImageB используют различные атрибуты для представления изображения Общие атрибуты классов ImageA и ImageB хранятся в базовом классе (как атрибут пути) Вы объявляете абстрактный метод compare, который принимает тип Image в качестве аргумента, и возвращает двойное значение Цель состоит в том, чтобы передать метод сравнения ImageA типа ImageB, и возвращаемое значение будет указывать, какое конкретное представление изображения лучше. Таким образом, это будет означать, что реализация метода compare должна быть такой, что метод compare в классе ImageA будет вызываться с экземпляром типа ImageB, а наоборот будет реализация в классе ImageB Метод сравнения в классах ImageA и ImageB не может использовать методы в Image, поскольку они имеют разные атрибуты

Если это постановка проблемы действительно представляет вашу проблему, то я думаю, что не прибегая к проверкам типа instanceof и приведению не будет возможности провести сравнение между классами ImageA и ImageB. Хотя существует абстрактный класс Image, метод compare все еще зависит от того, какие атрибуты изображения (которые не совпадают) используются дочерними классами для представления изображения.

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