从多个类继承成员

时间:2013-12-17 08:08:46

标签: c# oop

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

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

现在,我想添加一个类Client,可以是PersonOrganization(待添加)。 Client也会有一些数据。

我考虑过接口,但它们只能有方法。任何人都可以帮我找到合适的设计吗?

我没有使用C#.NET跟踪任何模式和编码。


更新

我想我无法正确解释这个场景。对不起。请看一下图表。这里,Client类是我想要添加的。 Incomplete class diagram of my scenario

1 个答案:

答案 0 :(得分:4)

尝试使用合成。个人和组织不一定是用户,尽管他们都可以拥有地址或用户帐户。实际上他们很可能不止一个 如果你对AAS的考虑更多而在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"
  ...
}

现在,如果您需要模拟PersonOrganization都必须具有Address es的事实,您可以创建一个界面

interface IAddressable {
   IEnumerable<Address> {get;}
}

PersonOrganization实现它。对于包含AccountUsername的{​​{1}}类,也可以这样做。

现在PasswordPerson不需要是Organization,但他们都可以拥有帐户,地址以及您需要的任何其他内容。你可以通过接口强制他们拥有这些东西,如上所示。

至于User,我可以看到你的问题。你很想说“一个人(或一个组织)是一个客户”。但是在你的设计中“一个人已经是一个用户”了,你不能让Person继承两个不同的基类。

但是,请注意,某人不一定是客户。我不确定客户究竟在你的模型中是什么,但是我们假设它是一个有地址和账户的人,可以是一个人或一个组织(你想知道它是一个还是另一个)。 您可以通过多种方式执行此操作,但可以是:

Client

的优点是:

  • 您不必更改现有代码以将角色(客户端)改编为现有实体(人员,组织)的基类。
  • 如果您的公司开始将国家/地区作为客户,您可以添加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 } } 而不更改现有作品