LabVIEW OOP:从 child 初始化 parent
LabVIEW OOP: initializing parent from child
问题
如何在 LabVIEW 中设置我的 classes 以便我可以在 parent child classes 中保留不同 childes 之间的所有公共数据class 并仍然从 child class?
的 Initialize(data)
方法初始化该数据
背景
我有一个相当大的项目,我在其中使用 LabVIEW object-oriented 编程 (LVOOP) 工具来简化一些事情。我有一棵看起来像这样的 class 树:
理想情况下,我想做的是将所有 things 之间的公共数据保存在 GenericThing
class 中,但随后在 ThingType1
和 ThingType2
的独特 Initialize(data)
方法中将此数据与 class-specific 数据一起初始化。由于 class-specific 数据在两个 class 之间不同,并且此数据需要初始化,因此我不能对所有 Initialize(data)
方法使用相同的签名。
在Java我可以做这样的事情:
class abstract GenericThing {
protected String name;
public GenericThing(String name) {
this.name = name;
}
}
class ThingType1 extends GenericThing {
private int awesomeness; // additional data
public ThingType1(String name, int awesomeness) {
super(name);
this.awesomeness = awesomeness;
}
}
class ThingType2 extends ThingType2 {
private Boolean isSuperCool; // different additional data
public ThingType2(String name, Boolean isSuperCool) {
super(name);
this.isSuperCool = isSuperCool;
}
但对于我来说,我无法弄清楚如何在 LabVIEW 中做类似的事情。
目前尝试次数
我试图从几个角度来探讨这个问题。首先,我尝试在我的 GenericThing
class 中创建一个 Initialize(data)
动态调度方法,然后在 child classes 中覆盖它,但是如果你这样做会出错尝试更改方法的签名(不同 inputs/outputs):
好的,所以我不能那样做。接下来我尝试为 GenericThing
class 创建数据成员访问方法并从 child class 调用它们,但我不知道如何以实际的方式调用它们持久地设置数据。我的尝试:
基本上使用 To More Generic Class
VI 获取对 parent class 的引用,并使用我为 GenericThing
创建的成员访问方法设置其数据。这个版本运行得很好,但是当我尝试初始化 parent 和 child 数据然后读回该数据时(同样使用 To More Generic Class
和我的数据成员访问方法来读取 parent 的数据),我没有得到 parent 的数据。
我在写这篇文章的时候发现了一些有用的东西,但这让我很头疼,我不想放弃我的 post。我几乎就在那里提出问题。基本上当我在 ThingType1
的 Initialize
方法中初始化 GenericThing
数据时,我需要将 GenericThing
的数据成员访问方法的输出重新转换为 ThingType1
对象,也初始化它的数据,然后像这样传递出去(编辑:我不需要重铸这个数据。我可以直接将子类型引用传递给父类型方法。框图更新如下:
我可以类似地在 Get Data
方法中将子类型引用直接传递给我的父类型方法:
最后,我可以通过从 VI 调用这些方法来初始化和读取我的数据:
使用一些随机输入值 运行 的结果:
太棒了!如果您有更好的方法,请告诉我。
更新
我根据评论中的一些反馈更新了我的框图。这对我解决问题的尝试有很大改进:我可以直接将子项的引用连接到父类方法中,而无需处理使我的图表混乱的 up-casting/down-casting 语法!
问题
如何在 LabVIEW 中设置我的 classes 以便我可以在 parent child classes 中保留不同 childes 之间的所有公共数据class 并仍然从 child class?
的Initialize(data)
方法初始化该数据
背景
我有一个相当大的项目,我在其中使用 LabVIEW object-oriented 编程 (LVOOP) 工具来简化一些事情。我有一棵看起来像这样的 class 树:
理想情况下,我想做的是将所有 things 之间的公共数据保存在 GenericThing
class 中,但随后在 ThingType1
和 ThingType2
的独特 Initialize(data)
方法中将此数据与 class-specific 数据一起初始化。由于 class-specific 数据在两个 class 之间不同,并且此数据需要初始化,因此我不能对所有 Initialize(data)
方法使用相同的签名。
在Java我可以做这样的事情:
class abstract GenericThing {
protected String name;
public GenericThing(String name) {
this.name = name;
}
}
class ThingType1 extends GenericThing {
private int awesomeness; // additional data
public ThingType1(String name, int awesomeness) {
super(name);
this.awesomeness = awesomeness;
}
}
class ThingType2 extends ThingType2 {
private Boolean isSuperCool; // different additional data
public ThingType2(String name, Boolean isSuperCool) {
super(name);
this.isSuperCool = isSuperCool;
}
但对于我来说,我无法弄清楚如何在 LabVIEW 中做类似的事情。
目前尝试次数
我试图从几个角度来探讨这个问题。首先,我尝试在我的 GenericThing
class 中创建一个 Initialize(data)
动态调度方法,然后在 child classes 中覆盖它,但是如果你这样做会出错尝试更改方法的签名(不同 inputs/outputs):
好的,所以我不能那样做。接下来我尝试为 GenericThing
class 创建数据成员访问方法并从 child class 调用它们,但我不知道如何以实际的方式调用它们持久地设置数据。我的尝试:
基本上使用 To More Generic Class
VI 获取对 parent class 的引用,并使用我为 GenericThing
创建的成员访问方法设置其数据。这个版本运行得很好,但是当我尝试初始化 parent 和 child 数据然后读回该数据时(同样使用 To More Generic Class
和我的数据成员访问方法来读取 parent 的数据),我没有得到 parent 的数据。
我在写这篇文章的时候发现了一些有用的东西,但这让我很头疼,我不想放弃我的 post。我几乎就在那里提出问题。基本上当我在 ThingType1
的 Initialize
方法中初始化 GenericThing
数据时,我需要将 GenericThing
的数据成员访问方法的输出重新转换为 ThingType1
对象,也初始化它的数据,然后像这样传递出去(编辑:我不需要重铸这个数据。我可以直接将子类型引用传递给父类型方法。框图更新如下:
我可以类似地在 Get Data
方法中将子类型引用直接传递给我的父类型方法:
最后,我可以通过从 VI 调用这些方法来初始化和读取我的数据:
使用一些随机输入值 运行 的结果:
太棒了!如果您有更好的方法,请告诉我。
更新
我根据评论中的一些反馈更新了我的框图。这对我解决问题的尝试有很大改进:我可以直接将子项的引用连接到父类方法中,而无需处理使我的图表混乱的 up-casting/down-casting 语法!