0

我有一个域类等中的一种:Grails的自动强制串到我的领域类

class MyDomainClass{ 
    String name 
} 

而且与接口的签名,如:

BigDecimal doBigThangs(MyDomainClass startHere) 

我希望能够调用它像这样

doBigThangs('stuff') 

并让它自动将字符串'stuff'转换成适当的MyDomainClass。这是我尝试过的,但也许我需要使用“asType”或其他东西。

ExpandoMetaClass.enableGlobally() 
String.metaClass.toMyDomainClass = {->MyDomainClass.findByNameLike(delegate)} 
+0

是否有可能使用简单的多态性来处理这个问题? – cdeszaq 2012-02-07 21:30:29

+0

我会尽量终于理解多态,并让你知道:p – Mikey 2012-02-07 21:35:36

+0

看起来像“多态”只是意味着“实现一个接口”,这仍然留给我一个问题:我如何在String上实现该接口? – Mikey 2012-02-07 21:38:46

回答

1

你是对的:你可以通过覆盖asType来添加一个类型转换。你的例子是这个样子:

oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[]) 
String.metaClass.asType = { Class c -> 
    if (c == MyDomainClass) { 
     MyDomainClass.findByNameLike(delegate) 
    } else { 
     oldAsType.invoke(delegate, c) 
    } 
} 

然而,常规不会悄悄蒙上字符串为另一种类型上的方法调用。你必须打电话给你的方法是这样的:

doBigThangs('stuff' as MyDomainClass) 
+0

谢谢,多数民众赞成我正在寻找。有什么方法可以使用'super()'而不是'oldAsType'的东西吗?我试图让我的脑袋围绕所有常规概念。 – Mikey 2012-02-07 21:50:27

+0

据我所知,一旦覆盖'asType' metaMethod,除非你保存了一个引用,否则旧的不见了。 – ataylor 2012-02-07 21:53:11

+0

我的理解是,def没有写“def oldAsType”,def只是让事情变得局部......很奇怪。 – Mikey 2012-02-07 22:02:50