Параметры, реализующие определенный интерфейс и имеющие определенный суперкласс: generics или instanceof? - PullRequest
1 голос
/ 29 июня 2010

Я бы хотел помочь с определенным дизайном. Это код, который я хотел бы работал:

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) {...}
}

Словом, Canvas должен реализовывать спецификацию Interface, НО методы рисования должны только обрабатывать подклассы Square и Circle, которые реализуют 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
    }
}

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

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

  • Есть ли третье решение, которое выглядит лучше?
  • Если нет, то что из двух "лучше"?

1 Ответ

2 голосов
/ 29 июня 2010

ИМХО использование обобщений лучше, так как компилятор может дать вам некоторую статическую проверку типов.Во втором случае вы найдете ошибку во время выполнения.

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

...