假设我正在编写一个视频店应用程序,其数据库具有 Person 表,其中包含 PersonId、Name、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; }
}
现在我们可以编写一个名为“say”的函数,用于向所有客户发送电子邮件:
static void SendEmailToCustomers(IEnumerable<Person> everyone) {
foreach(Person p in everyone)
if(p is Customer)
SendEmail(p);
}
这个系统在没有既是客户又是员工的人时运作良好。假设我们不想让everyone
名单中同一个人以客户和员工两种身份出现,我们应该在以下两者之间做出任意选择吗:
class StaffCustomer : Customer { ...
并且。
class StaffCustomer : Staff { ...
显然,这两种方法中只有第一种不会破坏SendEmailToCustomers
函数。
那你会怎么做呢?
- 使
Person
类具有对StaffDetails
和CustomerDetails
类的可选引用? - 创建一个包含
Person
以及可选StaffDetails
和CustomerDetails
的新类? - 将所有内容都变成接口(例如,
IPerson
、IStaff
、ICustomer
),并创建三个实现适当接口的类? - 采取另一种完全不同的方法?