【发布时间】:2012-02-24 19:13:08
【问题描述】:
我遇到了这样一种情况,即在父/子层次结构中,我有两级多态性,一个在另一个内部。
我认为这最好用一个简单的例子来解释:
class Group
{
public IList<Person> People { get; set; }
}
class SpecialGroup : Group
{
public IList<SpecialPerson> People { get; set; }
}
class Person {}
class SpecialPerson : Person {}
所以一个Group有一个Person对象的列表,而一个专门的Group(SpecialGroup)有一个专门的Person(SpecialPerson)对象列表。
这可以编译,但我收到警告说我应该在 SpecialGroup.People 上使用“new”关键字,因为它隐藏了 Group.People 属性。
我理解这意味着什么,但也许我不完全理解如何在 C# 中正确地建模这样的东西。关于如何以更好的方式对此建模有任何想法吗?
另外,知道这将如何与 NHibernate 一起玩吗?我不确定使用“new”关键字是否会减少它,因为 Group.People 属性已经被映射为不同的类型。有没有更好的方法来模拟这个,以一种与 NH 兼容的方式?
好的,我想到了一种使用泛型对此进行建模的方法:
abstract class AbstractGroup<PersonType>
where PersonType : Person
{
public IList<PersonType> People { get; set; }
}
class Group : AbstractGroup<Person>
{}
class SpecialGroup : AbstractGroup<SpecialPerson>
{}
class Person {}
class SpecialPerson : Person {}
我认为这是我想要的?现在 Person 可以与 SpecialPerson 共享特征,但只能将 SpecialPerson 添加到 SpecialGroup。 AbstractGroup 基类型可以对任何组共有的特征进行建模。
现在的问题是,如果我尝试绘制这个地图,NH 会不会爆炸?
据记录,似乎有些人已成功使用泛型类的查询 - 对于 HQL 查询(我的用例),这是不受支持的。
我想到的另一种方法是简单地隐藏父级的属性实现,例如对子类中的覆盖属性使用“new”关键字 - 以下线程讨论了为什么这也不起作用:
NHibernate: Table Per Subclass Mapping and the New Keyword
到目前为止的结论:运行时检查和异常,正如下面@empi 提出的那样。
【问题讨论】:
-
为什么SpecialGroup需要继承Group?
-
嗯,这是一个非常简单的例子——但是 SpecialGroup 与 Group 有很多共同点,所以它确实需要继承。该示例仅显示了我认为对问题本身至关重要的内容。
标签: c# oop nhibernate mapping polymorphism