我想问一个关于如何处理简单的面向对象设计问题的问题。对于解决这种情况的最佳方法,我有一些自己的想法,但我很想听听 Stack Overflow 社区的一些意见。相关在线文章的链接也值得赞赏。我正在使用 C#,但问题不是特定于语言的。
假设我正在编写一个视频商店应用程序,其数据库有一个Person
表,其中包含、PersonId
和Name
字段。它还有一个表,它有一个链接到 a ,还有一个表也链接到。DateOfBirth
Address
Staff
PersonId
Customer
PersonId
一个简单的面向对象的方法是说Customer
“是” Person
,因此创建类有点像这样:
class Person {
public int PersonId { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
class Customer : Person {
public int CustomerId { get; set; }
public DateTime JoinedDate { get; set; }
}
class Staff : Person {
public int StaffId { get; set; }
public string JobTitle { get; set; }
}
现在我们可以编写一个函数来向所有客户发送电子邮件:
static void SendEmailToCustomers(IEnumerable<Person> everyone) {
foreach(Person p in everyone)
if(p is Customer)
SendEmail(p);
}
这个系统运行良好,直到我们有一个既是客户又是员工的人。假设我们真的不希望我们的everyone
列表中有两次相同的人,一次作为 aCustomer
一次作为 a Staff
,我们是否可以在以下之间做出任意选择:
class StaffCustomer : Customer { ...
和
class StaffCustomer : Staff { ...
显然只有这两个中的第一个不会破坏该SendEmailToCustomers
功能。
那你会怎么做?
- 使类具有对 a和类
Person
的可选引用?StaffDetails
CustomerDetails
- 创建一个新类,其中包含一个
Person
,加上可选StaffDetails
和CustomerDetails
? - 让所有东西都成为一个接口(例如
IPerson
,IStaff
,ICustomer
)并创建三个实现相应接口的类? - 采取另一种完全不同的方法?