Параметры реализовывая определенный интерфейс и имея определенный суперкласс: дженерики или instanceof?

Я любил бы некоторую справку на конкретном дизайне. Это - код, которого я желаю работавший:

abstract class Square {...}
abstract class Circle {...}

interface JPGExportable {...}

class SquareJPG extends Square implements JPGExportable {...}
class CircleJPG extends Circle implements JPGExportable {...}

interface Interface {
    draw(Square square);
    draw(Circle circle);
}

class Canvas implements Interface {
    draw(SquareJPG squarejpg) {...}
    draw(CircleJPG circlejpg) {...}
}

В словах Холст должен реализовать спецификацию, которая является Интерфейсом, НО тянуть-методы должны только обработать подклассы Квадрата и Круга та реализация JPGExportable.

К моему знанию существует два решения, которые работают, но ни один из которых я думаю, очень симпатично:

/*
 * Using generics
 */
interface Interface<S extends Square, C extends Circle> {
    draw(S square);
    draw(C circle);
}

class Canvas implements Interface<SquareJPG, CircleJPG> {
    draw(SquareJPG squarejpg) {...}
    draw(CircleJPG circlejpg) {...}
}

/*
 * Using instanceof
 */
interface Interface {
    draw(S square);
    draw(C circle);
}

class Canvas implements Interface {
    draw(Square square) {
        if (square instanceof SquareJPG)
            // do stuff now
    }
    draw(Circle circle) {
        if (circle instanceof CircleJPG)
            // do stuff now
    }
}

В действительности Квадрат и Круг довольно отличны, почему общий суперкласс не смог бы содержать любой общий код. Кроме того, суперкласс, реализовывая JPGExportable чувствовал бы себя... неправильным; это - действительно подфункция.

Базовая причина, почему мне не нравится путь дженериков, состоит в том, что я должен обработать 7 различных типов. Возможно, я придирчив, но 7 происшествий "T расширяются, Тип" подряд выглядит ужасным.

  • Существует ли третье решение, которое выглядит лучше?
  • В противном случае, который из двух "лучше"?
1
задан eferm 29 June 2010 в 15:45
поделиться

1 ответ

IMHO использование дженериков лучше, так как в этом случае компилятор может дать вам некоторую статическую проверку типов. Во втором случае вы обнаружите ошибку во время выполнения.

Трудно найти альтернативный дизайн, не видя остальной части вашего кода. Например, можно ли нарисовать какой-нибудь JPGExportable? Может быть, у вас есть интерфейс с одним методом draw(JPGEXportable)?

2
ответ дан 2 September 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: