我希望对特定设计有所帮助。这是我希望的代码:
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的规范,但是draw-methods应该只处理实现JPGExportable的Square和Circle的子类。
据我所知,有两种解决方案可行,但我认为这两种解决方案都不是很漂亮:
/*
* 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延伸类型”看起来很难看。
答案 0 :(得分:2)
使用泛型的恕我直言是优越的,因为这种方式编译器可以给你一些静态类型检查。在第二种情况下,您会在运行时发现错误。
如果没有看到其余的代码,很难找到替代设计。即是否可以绘制任何JPGExportable?也许你只能使用一个方法绘制(JPGEXportable)?