【问题标题】:Inheritance and identifying object types in JavaJava中的继承和识别对象类型
【发布时间】:2012-06-25 19:24:12
【问题描述】:

好的,所以我正在处理一个带有抽象类 A 的项目。假设类 a1、a2 和 a3 都继承自类 A,并带有一些可能对每个子类都是唯一的附加方法。现在,这些对象可以通过用户交互与其他对象配对,但只能配对某些类型的对象,即对象 B 只能使用 a1,对象 C 只能使用 a2,并且用户尝试将它们配对否则会导致告诉他们他们不能。我当然想避免使用 instanceof,因为这在很大程度上是一种不好的做法,但我认为我目前有一个相当严重的脑胀气病例。我想在父类中添加一个 getType() 或一些这样的方法来返回每个子类唯一的字符串,但这感觉很陈旧。获取班级名称的感觉大致相同。我对我的 OO 和多态原则有点生疏,欢迎提出建议。

【问题讨论】:

  • 我认为在这种情况下使用 instanceof 没有任何问题,当您使用它在运行时检查类型时,应该在编译时检查类型,这被认为是一种不好的做法,但是您说将由用户进行配对(因此是运行时操作),因此 instanceof 似乎是一个不错的选择

标签: java inheritance polymorphism subclass abstract


【解决方案1】:

我正在考虑在这种情况下使用泛型的解决方案。

为此,您需要定义一个类来存储两个值,例如

类对

现在您将向哈希图中添加您可以拥有的所有类型的对。当需要该类型的一对时,您可以通过其名称获取该对。

缺点:

您必须将所有想要的对添加到容器中

您必须将一对与名称相关联

请注意,如果规模很大,这将是一个糟糕的解决方案。

【讨论】:

    【解决方案2】:

    如果您真的决定不使用 instanceof,并且无论出于何种原因,您都无法为实例类之外的配对定义参数,请向抽象类添加一组新方法,这些方法可以执行以下两项操作之一:

    a) 方法worksWithTypeB、worksWithTypeC 等,在适当的子类中定义它们。然而,这很像类型检查。

    b) 将类型 B 和 C 使用的方法转移到抽象类;通常在 B 和 C 可以使用的类中定义它们(假设 B 类型使用 a1.methodB,C 类型使用 a2.methodC),但定义它们以在方法中抛出异常否则存在(因此 a1.methodC 会引发异常,a2.methodB 也是如此)。

    尽管正如 ilcavero 所说,在这种情况下进行类型检查并没有什么问题。

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2018-09-30
      • 2013-10-16
      • 2011-05-26
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多