2015-12-16 93 views
0

我想強制所有管理MVC中的域對象的Command對象爲其各自的域對象實現一個setData方法。Groovy是否允許通用對象強制轉換爲抽象方法屬性?

所以,讓我們說這是給定:

class User { //this is a domain 
    Long id 
    String userName 
} 

和基本命令:

abstract class DomainObjectCommand { 
    ... 

    abstract setData(Object domain) 

    ... 
} 

最後,實際的命令對象,我們將使用:

class ListUserCommand extends DomainObjectCommand { 

    Long userId 
    String userName 

    public setData(User user) { //this is not a valid implementation of the abstract method because "Object" is not "User" 
     ... 
    } 
} 

有一個優雅方式做到這一點?

我想肯定所有命令對象域數據的命令設置的行爲方式類似,但顯然每個命令都會有自己獨特的域對象必須管理這麼抽象的方法需要允許任何域對象,而不僅僅是用戶或角色,或者不管它是什麼。

現在,我只是通過實施基本方法,並拋出一個基本的異常停止了「執法」:

public setData(Object domain) { 
    throw new NotImplementedException() 
} 
+0

我試過這個使用接口和抽象類,既不工作?一個抽象的基類方法和一個類型化的對象被傳入一個方法必須是這種類型 - 除非我誤會了?看來必須有一種方法來允許這樣的合同... – Gr3go

+0

顯然這是不可能的。我很震驚,groovy不允許這樣 - 它在其他地方非常靈活。任何人都可以解釋爲什麼OO不允許def或Object作爲抽象方法中的arg被轉換爲真正的通用對象嗎?我可以想到在這種情況下會有幫助的用途,特別是當您想讓其他開發人員遵循更嚴格的標準時... – Gr3go

回答

1

這可以用泛型類型來解決。抽象類定義了一個通用的類型會像這樣被使用:

abstract class DomainObjectCommand<T> { 
    ... 

    abstract setData(T domain) 

    ... 
} 

在實現類我們定義實際的類型(在這種情況下用戶)。

public class ListUserCommand extends DomainObjectCommand<User> { 
    Long userId 
    String userName 

    public setData(User user) { 

    } 
} 
+0

謝謝!我不知道這個概念 - 它完美地工作。 :) – Gr3go

+0

我不能滿足你的反應,但我不得不等待,直到我在15歲。但我很感激你的反饋。 – Gr3go