【问题标题】:Groovy Prototype ObjectGroovy 原型对象
【发布时间】:2010-02-24 04:40:22
【问题描述】:

我有一个带有传入变量的方法,它代表一个脚本。

例如

hello.groovy

Foo.init(this)

Foo.groovy

class Foo {
    static init(app) {

    }
}

在 init 方法中向 app 变量添加大量新功能的最佳方法是什么?基本上,我想将另一个对象的所有功能添加到app 对象。

例如,如果我有另一个班级:

class Bar {
    def a() { }

    def b() {

    }
}

我希望app 对象基本上是new Bar()。在 JavaScript 中,使用原型对象很容易,但我似乎无法让它在 groovy 中工作。实现这一目标的最佳方法是什么?还是我应该做一些不同的事情?

【问题讨论】:

    标签: groovy metaprogramming


    【解决方案1】:

    YourClass.metaClass.static.yourMethod 是我在 Groovy 中看到的最相似的 JS 原型。看看这个链接:

    Groovy meta-programming - adding static methods to Object.metaClass

    干杯。

    【讨论】:

      【解决方案2】:

      有几种方法可以做到这一点,每种方法都有优点和缺点。在 Groovy 文档页面上,Dynamic Groovy 部分说明了其中的几个。如果我理解正确,最简单的方法就是使用实例的 metaClass 来添加新功能,例如:

      class Foo {
        static void init (a) {
          a.metaClass.a = { println "a()"; }
          a.metaClass.b = { println "b()"; } 
        }
      }
      
      def myObject = new Object();
      Foo.init (myObject);
      
      myObject.a();
      myObject.b();
      

      【讨论】:

      • 我想将另一个对象(比如说new Bar())的所有方法自动添加到对象a。你的方法肯定行得通,但我不想在 init 方法中手动定义所有新方法。
      【解决方案3】:

      最简单的方法是使用 mixin。基本上,您可以在应用程序的类上调用 mixin 并将其传递给另一个类以将该功能合并到其中。

      我已经修改了您的示例以在 Bar 类中显示这种混合。

      class Foo {
          static init(app) {
              app.class.mixin Bar
          }
      }
      
      class Bar {
          def a() { println "a called" }
      
          def b() {
              println "b called"
          }
      }
      
      def app = new Object()
      Foo.init(app)
      app.a()
      app.b()
      

      这样的输出是:

      一个叫 b 叫

      在这种情况下,我将 Bar 添加到 Object 类中,但您可以将其添加到应用程序中的任何类中。

      【讨论】:

      • 我喜欢你的解决方案,我知道它肯定可以工作,但如果 app 对象是传入脚本,它就不起作用。即从外部脚本我想说 Foo.init(this).
      • 你知道为什么当前对象是脚本时它不起作用吗?脚本对象有什么特别之处?
      • 我认为这与 Script 类的运行方式有关。堆栈跟踪指的是它找不到 ScriptClass.a() 这意味着它正在尝试调用静态方法。脚本中的方法可能被认为是类上的静态方法,但我不知道。我对 groovy 内部的脚本如何工作没有那么深入的了解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多