从多个类继承成员

Rai*_*han 5 c# oop

我一直在学习使用OOD进行设计并坚持使用场景。

我有一个User扩展抽象类的类Person。类Person具有类型为的成员AddressUser仅具有用户名和密码,并Address具有一些字符串字段。

现在,我想添加一个Client可以是a Person或an Organization(要添加)的类。Client也会有一些数据。

我考虑过接口,但是它们只能有方法。谁能为我提供合适的设计?

我没有遵循任何模式并使用C#.NET进行编码。


更新资料

我想我无法正确解释这种情况。抱歉 请看一下图表。在这里,Client我要添加的课程是。 我的场景的类图不完整

Pao*_*lla 4

尝试组合。个人和组织不一定是用户,尽管他们都可以拥有地址或用户帐户。事实上,他们很可能同时拥有不止一种。
如果您更多地考虑“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)

两者兼而有之PersonOrganization实施它。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而不更改现有的部分