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

标签 java generics design-patterns model simulation

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

相关文章:

java - 在泛型方法中传递类型时,使用 TypeReference 的 ObjectMapper 不起作用

java - Java中数组和泛型的类型规则

unit-testing - 像 isInUnitTest() 这样的检查是反模式吗?

java - 应用程序在果冻 bean 上崩溃

java - 如何创建一个在给定范围内随机打乱数字的 int 数组

java - 在属性文件中查找重复键和值的工具

java - 在避免实现继承和保持内部化的同时最大化代码重用的最佳方法

java - 在上传多个 apk 的情况下从 Google PlayStore 获取最新的应用程序版本

c# - 将具有泛型参数的静态方法转换为泛型类

c# - 如何安全干净地重写关键/生产代码?