![]() |
1
4
您已经实现的(按类映射方法)是我在教授模式时讨论的GOF访问者模式的一个替代方案。它的效率和可扩展性,甚至在运行时也是如此。比if/else if/else硬接线方法要好得多。 键入类的唯一问题是,如果实际实例实现的是子类型而不是您提到的类类型,那么查找映射将不起作用。 如果您需要识别子类型,我建议使用Aaron的方法(沿着超类链走),但您也可能希望查看实现的接口。如果您只需要“精确的类匹配”,请保持getOperator简单。 注意,getoperator中有一个bug——它应该如下所示:
还有一件事…将您的地图隐藏在另一个类中,并按如下方式进行管理:
这可以防止任何人注册一个对所键入的类无效的运算符。(您可能希望使用operator作为参数来允许针对超类编写的运算符,但可能不需要这样做) |
![]() |
2
2
构建一个映射的一个问题是它不支持子类,除非您专门注册它们或者扩展get函数来专门查找超级类。 也就是说,如果B继承自A,并且您已经向A.Class注册了一个运算符。除非将getOperator更改为以下类型,否则使用b.class获取运算符将失败:
一旦有了合理的getOperator实现,将类映射到运算符似乎是一种合理的方法。 |
![]() |
3
1
您可以通过class.isassignablefrom绕过子类型问题。我一直在使用这个,虽然它不是“访客”优雅,但在实践中是相当好的。 |
![]() |
4
0
是否可以创建自己的类来扩展生成的类,然后让类实现接口? |
![]() |
5
0
您是否考虑过:
但是,关于第二个问题,即让一个操作符指向一个对象,而实际上不需要执行“instanceof”mojo(我想这就是看起来不干净的地方): 我建议,如果您不能根据您的具体需要修改类,请在它们周围编写一个包装器:
这能满足你的需要吗? 围绕那些与您的需求不完全匹配,并且不能由您控制的类编写包装纸,这始终是一个很好的实践。它可以帮助您保持代码的健康,即使这些疯狂的类发生了变化。 干杯, JRH。 |
![]() |
6
0
我要说,根据Java处理泛型的方式,仅仅使用接口本身是不可能的。 在爪哇,泛型在编译时被擦除,并被替换为强制转换。 实际上我还没有检查它在内部的工作方式,但我猜想,您的界面会变成这样:
在它被召唤的地方:
这仍然不是完全正确的,因为类型也会在返回后被强制转换,加上Java字节码实际上看起来不像Java,但是你可能会得到一般的想法。 instanceof和map方法应该可以工作,即使它们有点混乱。 |
![]() |
Eris · 纯虚拟成员有什么优势吗(除了他们可能防止的人为错误)? 2 年前 |
![]() |
AJA SMBAT · 我在获取列表而不是绑定方法时遇到问题 2 年前 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
![]() |
amirreza870 · Python OOP-更改类文本 2 年前 |
![]() |
Rocket Procd · 获取活动类实例的数量 2 年前 |
![]() |
cred · 为什么我请求的变量在从另一个类调用时显示为0.0? 2 年前 |
![]() |
Oliver Guy · 一个类的所有实例共享相同的值 2 年前 |