【问题标题】:Subclass with additional method in JavaJava中具有附加方法的子类
【发布时间】:2013-11-21 23:05:41
【问题描述】:

我对 Java 中的子类有疑问。我有以下课程:

MainIterator implements Iterator{
   //... Methods from the interface Iterator

   public void foo(){
      //Do something...
   }
}

在我的主要课程中,我调用:

Iterator i = new MainIterator();
i.foo();

这不起作用,因为Iterator没有实现函数foo()。如果没有i 的类型转换,怎么可能让它工作? i 必须来自 Iterator 类型。

【问题讨论】:

  • 好吧,你可以用反射来做,但你不应该……在这种情况下,这只是一个 hack

标签: java class subclass superclass


【解决方案1】:
MainIterator i = new MainIterator();

Java 编译器只允许调用属于变量的已声明 类型的方法。如果你使用

Iterator i = new MainIterator();

您是在告诉编译器:我创建了一个 MainIterator 类型的 Iterator 实例,但您不需要在其余代码中了解这一点。只需将此对象视为 Iterator 的一个实例。 而且 Iterator 没有任何 foo() 方法。

【讨论】:

  • 感谢您的快速响应!但是,i 必须来自 Iterator 类型。是否有可能将方法添加到类型 Iterator 中?
  • 一个 MainIterator 是一个 迭代器。您可以将 MainIterator 的实例传递给任何需要 Iterator 的方法。这就是多态性的全部意义所在。比方说,有人问你一个电话来传递一个电话。你可以给他你的智能手机,因为智能手机就是电话。但是,如果您有手机,则除非该手机实际上是智能手机,否则您将无法上网。因此,如果您想打电话,将您的智能手机声明为电话就足够了。如果你想上网,你必须告诉编译器你有一部智能手机,而不仅仅是一部手机。
  • 我理解你的例子。这是一个奇怪的任务,我必须为学校做。我不一定要定义一个新类MainIterator,但是我必须让((Iterator) i).foo() 工作,但我认为除了创建子类​​之外别无他法...
  • ((Iterator) i).foo() 永远不会工作,因为 Iterator 没有 foo 方法。再问一个问题,解释你想要达到的目标,在更高的层次上,并使用更多的相关代码。
  • 好的,我看到唯一的方法是将 i 定义为 MainIterator 而不是 Iterator
【解决方案2】:

你可以将你的变量声明为MainIterator:

MainIterator i = new MainIterator();
i.foo();

或者你可以投射:

Iterator i = new MainIterator();
((MainIterator) i).foo();

没有其他方法可以做到这一点。

【讨论】:

    【解决方案3】:

    Iterator 没有定义 foo(),所以你不能直接在 Iterator 类型的变量上调用 foo()。

    MainIterator 定义了 foo(),因此您可以在 MainIterator 类型或子类型的变量上调用 foo()。

    您可以将 Iterator 类型的变量强制转换为 MainIterator。真的没有其他办法解决这个问题。这就是它应该如何工作的方式。

    【讨论】:

      【解决方案4】:

      如果你确定在你使用i的那一点上,i肯定MainIterator类型的,可以投它.此外,如果您确定此时需要一个具体的 MainIterator 实例,则只需将其键入为 MainIterator i = new MainIterator()。对于这两种情况,这意味着您的设计与特定实现紧密耦合,这违背了使用接口的目的。因此,在这一点上,我将查看设计以确保在您确定您只需要MainIterator 的实例而不需要其他实例的情况下发生这种情况。

      如果您必须使用Iterator,但i 可以是Iterator 的任何实现,那么您遇到了设计问题,因为您与特定实现紧密耦合(因为您想要 使用void foo 方法),但您的代码 想要使用所有实现。这是一个你必须要解决的矛盾,如果不看你的整体设计,你很难说如何去纠正它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多