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