モデル化しようとしているのは電話の連絡先と電子メールの連絡先のようですが、実際には電話または電子メールという主要な連絡方法を持つ連絡先だと思います。私がそれを構築する方法は、構成を使用することです-複数の電話番号/電子メールを柔軟に使用したい場合. それぞれの 1 つを使用できる場合は、連絡先テーブルに直接保存できます。複数のアドレスが必要な場合は、別のテーブルを使用して電話/メールと同じ方法で処理します。
連絡先テーブル
連絡先ID
ファーストネーム
苗字
MI
住所1
番地2
街
都道府県
郵便番号
PreferredContactMethod (0 = 電話、1 = メール)
... 詳細 ...
PhoneNumbers テーブル
電話番号
連絡先ID
電話番号
IsPrimary
...詳細...
EmailAddresses テーブル
電子メールID
連絡先ID
電子メールアドレス
IsPrimary
...詳細...
クラスには、1 つ以上の PhoneNumbers と 1 つ以上の EmailAddresses を含む Contact クラスがあります。電話番号や電子メール アドレスを持つ連絡先以外のものがある場合、それらが 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 はどちらのインターフェイスも実装しません。サブクラスはそれぞれ適切なものを実装します。