我一直在学习使用OOD设计并坚持使用场景。
我有一个类User
,它扩展了一个抽象类Person
。类Person
的成员类型为Address
。 User
只有用户名和密码,Address
有一些字符串字段。
现在,我想添加一个类Client
,可以是Person
或Organization
(待添加)。 Client
也会有一些数据。
我考虑过接口,但它们只能有方法。任何人都可以帮我找到合适的设计吗?
我没有使用C#.NET跟踪任何模式和编码。
我想我无法正确解释这个场景。对不起。请看一下图表。这里,Client
类是我想要添加的。
答案 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"
...
}
现在,如果您需要模拟Person
和Organization
都必须具有Address
es的事实,您可以创建一个界面
interface IAddressable {
IEnumerable<Address> {get;}
}
让Person
和Organization
实现它。对于包含Account
和Username
的{{1}}类,也可以这样做。
现在Password
和Person
不需要是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
}
}
而不更改现有作品