Groovy是否允许对抽象方法属性进行通用对象转换?

时间:2015-12-16 19:12:50

标签: oop inheritance groovy

我想强制管理MVC中通信域对象的所有Command对象为其各自的域对象实现setData方法。

所以,让我们说它是:

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()
}

1 个答案:

答案 0 :(得分:1)

这可以通过泛型类型来解决。抽象类定义将使用泛型类型:

abstract class DomainObjectCommand<T> {
    ...

    abstract setData(T domain)

    ...
} 

在实现类中,我们定义实际类型(在本例中为user)。

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

    public setData( User user ) {

    }
}