【问题标题】:Method override in GroovyGroovy 中的方法覆盖
【发布时间】:2015-04-30 05:10:30
【问题描述】:

在 Groovy 中,如何在扩展超类的类中覆盖超类中的方法? Java 方式不起作用,因为两种方法(超类中的一种和子类中的一种)都在执行。例如:

class SuperClass {

  SuperClass(){

    println("This is the superclass")
  }

  def awaitServer(){
    println("awaiting server in the superclass")
  }

}


class SubClass extends SuperClass{


  SubClass(){
    println("This is the subclass")
  }

  @Override
  def awaitServer(){
    println("awaiting server in the subclass")
  }

}

//////
SubClass sb = new SubClass()
sb.awaitServer()

我得到的输出是:

awaiting server in the superclass
awaiting server in the subclass

正如您所见,当我在子类中覆盖超类的方法时,这两种方法都已执行。为什么会这样? Groovy 中的方法重写是如何实现的?

我在网上搜索过,但我无法弄清楚。有人可以提供一个示例或一个简单的例子吗?

提前谢谢你,

【问题讨论】:

  • 我认为你在翻译一个例子时丢失了一些东西,因为它有效......
  • 它会打印两者中的任何一个而不是两者——不管发生了什么。除非您在示例中忘记了,awaitServer 的子类中有一个 super 调用。
  • 所以底线是,这段代码不是 OP 实际执行的代码。请参阅底部关于 @TaskAction 的 cmets。误导性问题。

标签: inheritance groovy


【解决方案1】:

您忘记添加def。此代码正常工作:

class SuperClass {
   SuperClass(){
      println("This is the superclass")
   }

   def awaitServer() {
      println("awaiting server in the superclass")
   }
}

class SubClass extends SuperClass{

   SubClass() {
      println("This is the subclass")
   }

   @Override
   def awaitServer() {
      println("awaiting server in the subclass")
   }
}

SubClass sb = new SubClass()
sb.awaitServer()

它输出:

This is the superclass 
This is the subclass 
awaiting server in the subclass

看看下面的输出:

[opal@opal-mac-2]/tmp % cat lol.groovy 
class SuperClass {
   SuperClass(){
      println("This is the superclass")
   }

   def awaitServer() {
      println("awaiting server in the superclass")
   }
}

class SubClass extends SuperClass{

   SubClass() {
      println("This is the subclass")
   }

   @Override
   def awaitServer() {
      println("awaiting server in the subclass")
   }
}

SubClass sb = new SubClass()
sb.awaitServer()

[opal@opal-mac-2]/tmp % groovy -v
Groovy Version: 2.4.0 JVM: 1.8.0_05 Vendor: Oracle Corporation OS: Mac OS X
[opal@opal-mac-2]/tmp % groovy lol.groovy 
This is the superclass
This is the subclass
awaiting server in the subclass

使用 groovy 1.8.6:

[opal@opal-mac-2]/tmp % gvm use groovy 1.8.6
==== BROADCAST =================================================================
* 27/02/15: Springboot 1.1.11.RELEASE has been released on GVM. #spring
* 27/02/15: Springboot 1.2.2.RELEASE has been released on GVM. #spring
* 26/02/15: Grails 3.0.0.M2 has been released on GVM. #grailsframework
================================================================================

Stop! groovy 1.8.6 is not installed.
Do you want to install it now? (Y/n): Y

Downloading: groovy 1.8.6

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 15.5M  100 15.5M    0     0  2666k      0  0:00:05  0:00:05 --:--:-- 3716k

Installing: groovy 1.8.6
/Users/opal/.gvm/tmp/groovy-1.8.6 -> /Users/opal/.gvm/groovy/1.8.6
Done installing!


Using groovy version 1.8.6 in this shell.
[opal@opal-mac-2]/tmp % groovy lol.groovy 
This is the superclass
This is the subclass
awaiting server in the subclass

【讨论】:

  • 嗨 Opal 是的,我忘记在这篇文章中写“def”,但在我的代码中,我在方法名称之前有 def。但是这两种方法仍在执行中。
  • 你使用什么 groovy 版本?
  • 我正在使用 Groovy: 1.8.6
  • 您好 Opal,抱歉回复晚了。我终于弄清楚了为什么我会出现这种奇怪的行为。它与 Java 中继承和覆盖的工作方式无关。在我的代码中(不是上面的。这只是一个简单的例子),我用 TaskAction 注释标记了超类的方法。这导致了奇怪的行为。事实证明,当一个类中的方法被标记为 TaskAction,并且您在子类中覆盖该方法时,即使您正在覆盖它,超类的方法仍将被执行。
  • 不知道这是预期行为还是错误。我还没有那么先进,还不知道这一点。玩代码就找到了。
猜你喜欢
  • 2015-08-28
  • 2010-12-28
  • 2011-07-02
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
相关资源
最近更新 更多