在没有默认构造函数调用的情况下,使用委托注释+ extends for groovy类

时间:2014-12-03 18:07:50

标签: inheritance groovy interface delegates annotations

所以我遇到与herehere相同的问题。我有课程ABA将由B修饰。为了保存我的一些输入,我使用@delegate groovy注释,以便groovy处理对B方法的所有调用,并自动将它们分配到A类型对象,该对象保存在{{ 1}}。

这很好用,但我没有得到编译器的任何帮助。如果我尝试B,那么编译器就不够聪明了,这个方法调用将被委托给myB.someMethodOfClassA()并且A中存在这样的方法,所以它标记了它没有找到 - 在运行时它仍然可以工作。

我可以通过让AB延伸来解决这个问题。但是,然后在初始化B时调用A的默认构造函数,如果没有,则当然失败。

一个(干净的)解决方案是创建A并让AInterfaceA实现它。有没有另外(干净)的方式做我想要的,而不必一直创建一个接口? (如果B不在我的控制范围内,我甚至可能无法做到这一点)

以下是继承的示例:

A

以下类应该像oldClass一样使用,但添加另一个方法

public class OldClass {
    public String name
    public OldClass(String name) { this.name = name }
    public sayHello() { println "hello $name" }
}

我现在可以这样使用它:

public class NewClass {
    @Delegate OldClass delegationForOldClass

    public NewClass(String name) { this.delegationForOldClass = new OldClass(name) }
    public sayGoodbye() { println "byebye" }
}

所以它在运行时编译并运行,即使我没有因为注释而在NewClass myNewClass = NewClass("James") myNewClass.sayHello() //prints "hello James" because the @Delegation annotation delegates the call to the OldClass object myNewClass.sayGoodbye() //prints "bye" 扩展。但是,当我OldClass myNewClass.sayHello()可能不存在时,IDE编译器会抱怨(在编译时)。使用代码完成时,他也没有告诉我这种方法。因此,为了能够使用代码完成,我可以这样做:

sayHello

但是只有public class NewClass extends OldClass { @Delegate OldClass delegationForOldClass public newClass(String name) { this.delegationForOldClass = new OldClass(name) } public sayGoodbye() { println "byebye" } } 的作品才有空构造函数。但事实并非如此,它只有一个带字符串的构造函数。所以groovy尝试调用默认构造函数,因为extends关键字(它在java中是一样的吗?)当然失败了。如果我向OldClass添加一个默认构造函数,那么它将起作用,但我不想这样做。

有没有办法解决这种问题?

0 个答案:

没有答案