gpt4 book ai didi

java - 通过数组元素实现的接口(interface)进行不同的处理

转载 作者:行者123 更新时间:2023-12-01 17:29:18 25 4
gpt4 key购买 nike

假设有一个 ArrayList,其中包含许多“Element”类型的不同元素。所有这些都将无限循环地绘制到屏幕上。

这些“Element”可以实现 0..n 个接口(interface),如“Movable”、“Selectable”等。

到目前为止我尝试的是迭代所有元素并检查类似的接口(interface):

ArrayList<Element> allElements;
...

for (Element element : allElements) {
if (element instanceof Movable) {
((Movable)element).move();
}
if (element instanceof Selectable) {
...
}

element.draw();
}

不过,我对这种方法并不满意,因为它违反了开放/封闭原则(可能还违反了数千条其他原则)。当然,我可以重新设计它,以便每个元素根据它实现的接口(interface)自行响应:

for (Element element : allElements) {
element.move(); // element checks itself if it can move, and if true moves
...
}

缺点是 Element 类必须为每个可能的行为提供签名,即它必须提供每个接口(interface)的方法,并且可能在子类中重写它们。这也不是我想要的,因为它使 Element 类变得臃肿。

我还尝试通过这样的界面选择元素:

getElementsByInterface(Movable, allElements) { ... }

(Movable是界面,allElements是ArrayList)

但是它无法编译。看来 Java 不再知道运行时的接口(interface)了。

长话短说(抱歉我的帖子可能过于冗长):让数组元素根据其能力(/接口(interface))使用react的最佳设计解决方案是什么?

最佳答案

我认为这种方法没有本质上的错误。

基本上有two approaches对于这种情况:

  1. 使用多态性和 Visitor pattern 。由于LSP(界面方面) ,这引入了每个处理程序必须实现所有操作的“缺点”。

  2. 使用基于本地类型的切换(这在像 ScalaADTs 这样的语言中更常见,这种方法是 acceptable/common ;相比之下,Java 语法有点笨拙)。

没有违反(多态)open/closed这里因为正在使用接口(interface),并且“操作”仍然留在实现中(仍然支持多态性,因此“开放”);只是行动的选择不是。

关于java - 通过数组元素实现的接口(interface)进行不同的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12575998/

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