gpt4 book ai didi

java - 为基于 block 的模型设计(Java)设置通用架构?

转载 作者:行者123 更新时间:2023-11-29 08:51:36 27 4
gpt4 key购买 nike

不久前,我开始对 OOP 和 Java 感到兴奋。由于我不是 IT 人员而是一名工程师并且经常使用 Matlab/Simulink,因此我决定将一个简单的 Java 建模和仿真系统作为我的第一个项目。我正在尝试创建一个由 block 组成的模型。每个 block 都可以有输入和输出信号,并且可以连接 block 。 block 集可以创建子系统,这基本上是子模型的分组和重用。一个完整的模型,我称之为系统,可以在离散的时间步长中进行模拟。


Block
input1 |¯¯¯¯¯¯|
---->|custom| output1
input2 | code |---->
---->| |
|______|

首先我创建了一个类Signal<T>有一些字段,如名称和单位。信号的数据存储在字段列表数据中,因此在我调用的构造函数中

data = new ArrayList<T>(width);

这样一个信号可以包含一个值列表。现在我创建了一个类 AbstractGeneralBlock

public abstract class AbstractGeneralBlock implements SystemBlock

该类实现了各种 block 通用的一些字段和方法。SystemBlock 定义了每个 block 必须具有的方法,例如:getOutputs、getInputs、initializeBlock 等但是每个 block 对象还应该有一个 addInput 和 setInputs 方法。这就是它变得棘手的地方。

自定义 block 可以有多个输入信号,每个信号可以是不同的类型。对于上面的示例,input1 可以是 Signal<Double> 类型而 input2 可能属于 Signal<Boolean> .因为 block 中的所有输入都存储在 List<Signal<T>> 中,我在我的 SystemBlock 接口(interface)中定义了方法 addInput 如下:

public void addInput(Signal<?> input);

直到现在一切正常,但是一旦我想创建一个特定的 block ,比如 Gain(基本上是输出=输入*因子),我就会遇到问题。 Gain 类应该被参数化:

public class Gain<T> extends AbstractGeneralBlock

只要我想实现方法 addInput,我希望它只接受 Signal 类型的输入,但我的 addInput 需要一个类型为 Signal<?> 的参数.所以我无法控制我在 Gain 类的输入列表中存储的内容。

另一方面,如果我在 SystemBlock 接口(interface)中使用 T 而不是 ? 定义 addInput 方法,则一个 block 不能有多个具有不同信号类型的输入。

我不确定我的问题是否清楚,我会尽力描述它。简而言之,我需要一个通用的 block 和信号架构。 block 需要能够保存不同信号类型的输入,但某些 block 必须参数化,以便用户可以控制输入类型。不幸的是,由于删除,我无法在运行时使用 instanceOf T 检查输入参数类型。

这个问题是完全荒谬的,还是有一些不错的设计模式可以帮助我?提前致谢。

最佳答案

如果您需要能够限制 addInput 可以接受不同子类的类型,我不知道该怎么做,除非给它一个类型参数,在这种情况下这意味着给SystemBlock 类型参数。请注意,对于某些子类,如果您的 block 可以接受多个不相关的类型,则可以使用 Object

关于java - 为基于 block 的模型设计(Java)设置通用架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22563939/

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