LabVIEW OOP:从子级初始化父级

时间:2015-07-10 15:43:19

标签: oop inheritance labview

问题

如何在LabVIEW中设置我的类,以便我可以在父类中的不同子类之间保留所有公共数据,并仍然从子类的Initialize(data)方法初始化该数据?

背景

我有一个相当大的项目,我使用LabVIEW面向对象编程(LVOOP)工具来简化一些事情。我有一个看起来像这样的类树:

representative class tree

理想情况下,我想要保留GenericThing类中所有事物之间的所有数据,但随后将该数据与类一起初始化Initialize(data)ThingType1的唯一ThingType2方法中的特定数据。由于特定于类的数据在两个类之间是不同的,并且需要初始化此数据,因此我不能对所有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中做类似的事情。

到目前为止的尝试

我试图从几个角度来解决这个问题。首先,我尝试在我的Initialize(data)类中创建GenericThing动态调度方法,然后在子类中重写它,但如果您尝试更改方法的签名(不同的输入/输出),则会出错):

fingerprint mismatch error

好的,所以我无法这样做。接下来,我尝试为GenericThing类创建数据成员访问方法并从子类中调用它们,但我无法弄清楚如何以实际设置数据的方式调用它们。我的尝试:

Initialize method that does not work

基本上使用To More Generic Class VI获取对父类的引用,并使用我为GenericThing创建的成员访问方法设置其数据。这个版本运行得很好,但是当我尝试初始化父数据和子数据然后读回那些数据时(类似地使用To More Generic Class和我的数据成员访问方法来读取父数据),我没有得到父母的数据。

1 个答案:

答案 0 :(得分:1)

我在写这篇文章的过程中发现了一些有用的东西,但这让我头疼不已,以至于我不想放弃我的帖子。这个问题几乎就在我身边。基本上,当我在GenericThing ThingType1方法中初始化Initialize数据时,我需要重新投射GenericThing数据成员的输出访问ThingType1对象的方法,初始化数据,然后将其传递出去(编辑:我不需要重新传输此数据。我可以直接将子类型引用传递给父类型方法。下面更新的方框图):

Working Initialize method

我可以类似地将子类型引用直接传递给Get Data方法中的父类型方法:

Working Get Data method

最后,我可以通过从VI调用这些方法来初始化和读取我的数据:

Working test VI block diagram

使用一些随机输入值运行它的结果:

Working test VI front panel

Tadaa!如果你有更好的方法,请告诉我。

更新

我根据评论中的一些反馈更新了我的框图。这对我解决问题的尝试有了很大的改进:我可以直接将孩子的引用连接到父类型的方法,而不用处理混乱我的图表的向上/向下翻译语法! / p>