不久前,我开始对 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/