Я бы хотел помочь с определенным дизайном. Это код, который я хотел бы работал:
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" подряд выглядят ужасно.
- Есть ли третье решение, которое выглядит лучше?
- Если нет, то что из двух "лучше"?