将对象类更改为子类(&一般关于继承的问题)

时间:2011-09-25 13:02:08

标签: java inheritance object groovy

假设我有一个班级clubMember和一个班级user。只有俱乐部成员可以是用户,用户拥有其他俱乐部成员变量之外的登录数据,俱乐部成员的特征影响他们拥有的用户的权利,因此user延伸clubMember

现在假设一个俱乐部成员想要使用我正在编程的grails servlet。创建一个新的user实例将导致双重输入,此外我将丢失前一个成员与其他类之间存在的所有链接。那么将clubMember的类型转换为user可能是最好的方法吗?如果是这样,怎么办(在Groovy中)?

或者,您能否向我推荐除子类之外的实现方法?理想情况下,诸如“列出所有成员”之类的请求也应该返回用户,这是否属于子类的情况? (编辑:我的grails app就是这种情况)

相关:Java: Creating a subclass object from a parent objectIs it ever valid to convert an object from a base class to a subclass

1 个答案:

答案 0 :(得分:0)

如果您希望某个类型的某个值成为不同类型的新值,那么您在Groovy中基本上有两种方式:

  1. asType:例如“foo as Bar”Groovy会将表达式转换为“foo.asType(Bar.class)”,这意味着您可以将一个asType方法添加到foo类中以便为您进行转换。在您的情况下,您可以将asType添加到User并让它处理ClubMember。
  2. 显式或隐式强制转换:在“(Bar)集合中”Groovy将在Bar中查找一个构造函数,该构造函数可以为集合获取适当数量的参数,然后从中创建一个新的Bar对象。实际上它不仅限于集合,数组也可以。无论如何......在你的例子中,你可以添加一个构造函数,将ClubMember带到User,然后转换包含你想要转换的成员的集合。在侧节点上...如果将集合分配给Bar类型变量,则也会发生此转换(隐式强制转换)。
  3. 如果你想要转换方法(我很自由并且也在构造函数中调用转换方法)而不是在类中,你仍然可以使用asType版本或运行时元编程的类别来添加asType方法。需要或需要构造函数。

    但蒂姆在评论中提出,让ClubMember成为用户的成员似乎真的是最容易的版本