C# 在实体框架中设计具有多重(可选?)继承的模型
在过去的几天里,我一直在努力思考如何在EF中对这些实体进行建模。所以我决定请社区伸出援手:下面给出了核心类C# 在实体框架中设计具有多重(可选?)继承的模型,c#,entity-framework,oop,inheritance,composition,C#,Entity Framework,Oop,Inheritance,Composition,在过去的几天里,我一直在努力思考如何在EF中对这些实体进行建模。所以我决定请社区伸出援手:下面给出了核心类 class BaseEntity { long Id; DateTime DateCreated; } class Person : BaseEntity { string Name; string Address; } class Taxpayer : Person { string TaxpayerIdentificationNumber;
class BaseEntity
{
long Id;
DateTime DateCreated;
}
class Person : BaseEntity
{
string Name;
string Address;
}
class Taxpayer : Person
{
string TaxpayerIdentificationNumber;
double Income;
Taxpayer(or Person) Spouse;
}
class Client : BaseEntity
{
string CustomerId;
string ContactNumber;
}
class Partnership : Client
{
List<Taxpayer (or Person)> Partners;
}
class Company : Client
{
string CompanyRegistrationNumber;
}
这种情况下,客户可以是三种类型之一,即纳税人、合伙企业、公司专业化/IsA
问题是,对于纳税人类,他应该继承Client类和Person类的属性。更新:纳税人可以是客户,但不一定在使用纳税人类的其他地方也可以是客户,大多数情况下,纳税人类可以是个人类或纳税人类
关于如何进行有什么想法吗
谢谢。你可能需要考虑一下,而不是上课。以下示例可能会有所帮助:
interface IBaseEntity
{
long Id;
DateTime DateCreated;
}
interface IPerson : IBaseEntity
{
string Name;
string Address;
}
interface IClient : IBaseEntity
{
string CustomerId;
string ContactNumber;
}
class Taxpayer : IClient, IPerson
{
string TaxpayerIdentificationNumber;
double Income;
Taxpayer Spouse;
}
class Partnership : IClient
{
List<Taxpayer> Partners;
}
class Company : IClient
{
string CompanyRegistrationNumber;
}
大声思考:
人是很多东西,但总是人。一个人不会仅仅因为失业、在商业伙伴关系中、或在专业场合整洁地眨眼而变成具有不同DNA的新物种
这让我想到了组合,而不是继承。客户可能会有一个人的推荐人来告诉她是谁。纳税人或合伙人也是如此
伙伴关系是对特定行为的参与。对于伙伴关系课程,我不在乎你是谁,只是你可以在伙伴关系中发挥作用。所以现在我在想,如何有明确的,具体的功能,重点放在纳税,合作
这让我想到了两种设计模式,访问者和装饰者。Decorator动态地向现有类添加功能;本质上是通过组合而不是继承来扩展类。访问者针对给定对象或一组所述对象执行其功能。访问者可以解决双重分派问题,即缺少多重继承
我从设计模式中得到两件事。首先是灵感。如何思考我的问题是什么。事实证明,灵感和视角远比单纯的食谱模式更有帮助。二是具体的面向对象设计。这就是设计、修改和扩展,而无需借助业余代码hack-n-slash。但不要把这个设计看得太字面。这些是模式,而不是死板的口述。特定编程语言的特性可以在这些模式中工作。我在想我是如何在C中使用委托来代替命令模式中要求的命令子类的。为什么纳税人和客户不能都是继承人?他们不能,因为客户可以是合作伙伴/公司,而不是个人。感谢您的解决方案:这在一定程度上解决了这个问题。但是,当PartnersPatnerShip类或SpoosetAxPayer不是纳税人时,情况会怎样呢?