gpt4 book ai didi

java - 实现某个接口(interface)并具有特定父类(super class)的参数 : generics or instanceof?

转载 作者:行者123 更新时间:2023-11-30 05:11:44 25 4
gpt4 key购买 nike

我希望获得有关特定设计的帮助。这是我希望起作用的代码:

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 规范,但是绘制方法应该处理实现 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 是相当不同的,这就是为什么一个共同的父类(super class)不能包含任何共同的代码。另外,实现 JPGExportable 的父类(super class)会让人感觉……错误;这确实是一个子功能。

我不喜欢泛型方式的根本原因是我需要处理 7 种不同的类型。也许我很挑剔,但是连续出现 7 次“T extends Type”看起来很难看。

  • 还有第三种看起来更好的解决方案吗?
  • 如果不是,两者中哪一个“更好”?

最佳答案

恕我直言,使用泛型是更好的,因为这样编译器可以为您提供一些静态类型检查。在第二种情况下,您会在运行时发现错误。

如果不查看其余代码,就很难找到替代设计。 IE。是否可以绘制任何 JPGExportable?也许您可以拥有一个只有一种方法绘制(JPGEXportable)的界面?

关于java - 实现某个接口(interface)并具有特定父类(super class)的参数 : generics or instanceof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3142347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com