尝试组合。个人和组织不一定是用户,尽管他们都可以拥有地址或用户帐户。事实上,他们很可能同时拥有不止一种。
如果您更多地考虑“HAS A”而较少考虑“IS A”,您可以提出更易于维护的选择。例如你可以有一个
class Address {
public string street {get; private set;}
public string city {get; private set;}
public AddressTypes AddressType {get; private set;} // an enum to differentiate
// "home address", "legal address"
...
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您需要对 aPerson和 aOrganization都必须具有Addresses 的事实进行建模,您可以创建一个接口
interface IAddressable {
IEnumerable<Address> {get;}
}
Run Code Online (Sandbox Code Playgroud)
两者兼而有之Person并Organization实施它。Account对于包含Username和的类也可以这样做Password。
现在Person不需要Organization是 BE User,但他们都可以拥有帐户、地址和您需要的任何其他内容。您可以通过接口强制他们拥有这些东西,如上所示。
至于Client,我可以看到你的问题。您可能会说“一个人(或一个组织)是客户”。但在您的设计中,“一个人已经是一个用户”,并且您不能让 Person 从两个不同的基类继承。
但是,请注意,“人员”不一定是客户。我不确定您的模型中的客户到底是什么,但我们假设它是一个拥有地址和帐户的人,可以是个人或组织(并且您想知道是其中之一)。您可以通过多种方式执行此操作,但其中一种可能是:
abstract class Client : IAddressable, IWithAccount {
// implement IAddressable and IWithAccount
}
class PersonClient : Client
{
public PersonClient(Person person)
{
// make the Client's address refer to the Person's address
// make the Client's account refer to the Person's account
}
}
class OrganizationClient : Client
{
public OrganizationClient(Organization organization)
{
// make the Client's address refer to the Organization's address
// make the Client's account refer to the Organization's account
}
}
Run Code Online (Sandbox Code Playgroud)
优点是:
StateClient而不更改现有的部分