建模"我是*但我也是**"

ekk*_*kis 5 c# oop inheritance design-patterns entity-framework

在[ 这篇文章 ]中,我正在努力实现状态模式,正如@jonp建议的那样.我不太明白如何使用他发布的内容,但这导致我想到可能正在尝试将方形钉固定在圆孔中.所以我的问题:

如果我的网站访问者可以扮演多个角色,即a User可能是a Vendor,an Employer,an Advertiser,或者以上所有,我应该使用继承吗?我宣布:

class Vendor : User {}
class Advertiser : User {}
Run Code Online (Sandbox Code Playgroud)

等等,但是当用户既是供应商又是雇主时,不同类的实例确实指向相同的底层对象......我不确定这是否可行.我该如何建模?

*更新*

谢谢大家(你们都得到了一点(这是我能给的)).过去几天,我一直在用EF,向下转换和状态模式将头发拉出来.角色方法更有意义.

Nol*_*rin 4

这听起来像是属性模式(或者我这样称呼它)非常合适的情况。这是一种比简单继承更加松散耦合的方法,可用于指定多个“行为”或在您的情况下指定User. 实际上,没有什么比一个对象具有另一种对象的标签更复杂的了。

实现它的最简单的方法是有一个具体的User类,具有只读属性IList<UserRole>(在内部这可能是一个List<T>字段)。那么你的UserRole类将是抽象的,并且VendorRole/ AdvertiserRole/等等。将从它派生,允许您将任意数量的不同角色(甚至是相同类型的角色)标记到给定用户。这些角色还可以定义自己的自定义行为、实用方法等。

此外,您可以GetRole<TRole>在类上定义一个方法User,以方便访问特定类型的角色(假设每个角色User只有一个Role特定的子类型)。

旁注:您还可以考虑装饰器模式,它与上面提到的模式密切相关——尽管我个人觉得它在这里有点矫枉过正,并且在灵活性或功能方面确实没有增加任何东西。它常常只是模糊了你想要做的事情;无论如何,请随意调查。