听起来您要建模的是电话联系人和电子邮件联系人,但我认为您真正拥有的是具有主要联系方式的联系人:电话或电子邮件。我构建它的方式是组合——假设您希望灵活地拥有多个电话号码/电子邮件。如果每个人都可以使用一个,则可以将其直接存储在联系人表中。如果您需要多个地址,则使用与电话/电子邮件相同的方式处理它,并使用单独的表格。
联系人表
联系人 ID
名
姓
心肌梗死
街道地址1
街道地址2
城市
州省
邮政编码
PreferredContactMethod(0 = 电话,1 = 电子邮件)
... 更多细节 ...
电话号码表
电话号码
联系人 ID
电话号码
是主要的
...更多细节...
电子邮件地址表
电子邮件ID
联系人 ID
电子邮件地址
是主要的
...更多细节...
那么对于您的类,您将有一个 Contact 类,其中包含一个或多个 PhoneNumbers 和一个或多个 EmailAddresses。如果除了联系人以外,您还有其他东西有电话号码或电子邮件地址,那么让界面指示它们是 IPhoneable 或 IEmailable 可能是有意义的——这意味着您可以从中添加/删除电话号码或电子邮件地址,就像这样:
public interface IPhoneable
{
public PhoneNumber GetPrimaryNumber();
public void AddNumber( PhoneNUmber number );
public IEnumerable<PhoneNumber> GetNumbers();
}
public interface IEmailable
{
public EmailAddress GetPrimaryAddress();
public void AddEmailAddress( EmailAddress address );
public IEnumerable<EmailAddress> GetEmailAddresses();
}
public class Contact : IPhoneable, IEmailable
{
private List<PhoneNumber> phoneNumbers;
private List<EmailAddresses> emailAddresses;
public int ContactID { get; private set; }
public string FirstName { get; set; }
...
public Contact()
{
this.phoneNumbers = new List<PhoneNumber>();
this.emailAddresses = new List<EmailAddress>();
}
public PhoneNumber GetPrimaryNumber()
{
foreach (PhoneNumber number in this.phoneNumbers)
{
if (number.IsPrimary)
{
return number;
}
}
return null;
}
...
}
如果你愿意,你可以有一个 PhoneableContact 和一个 EmailableContact ,它们可以从 Contact 子类化,并且可以根据首选的联系方法进行区分,但我真的不认为有必要这样做。如果你这样做了,那么 Contact 将不会实现任何一个接口——子类将分别实现适当的接口。