1

あなたの会社で、次のコードがあるとします。

public abstract Phone
{
    public int PhoneID {get;set;}
    public string PhoneNumber {get;set;}
}

public CustomerPhone : Phone
{
    public int CustomerID {get;set;}
}

public AccountPhone : Phone
{
    public int AccountID {get;set;}
}

これが意味することは、複数のタイプの電話があり、一部は顧客の電話、一部はアカウントの電話など...

問題は、「これは可能ですか。可能であれば、どのようにですか?」ということです。Type をプラグインできる汎用の Phone クラスを用意し、必要に応じてその Type の情報 (AccountID または CustomerID) を使用するのが最も簡単なようです。また、これがDIなしで可能かどうかを確認しています(コンストラクター、メソッド、またはプロパティを介して)。

私の頭の中にあるものは、次のようになります。

public interface IUsePhone
{
    int GetOwnerID();
}

public class Phone<T> where T : IUsePhone
{
    //all of Phone's properties from above.

    public int GetOwnerID()
    {
        //return T or item or something's GetOwnerID();
    }
}

public class Account : IUsePhone
{
    private int _accountID;

    //other Account members, including an AccountID property.

    public int GetOwnerID()
    {
        return _accountID;
    }   

    public Phone<Account> Phone { get; set; }
}

public class Customer : IUsePhone
{
    private int _customerID;

    //other Customer members, including an CustomerID property.

    public int GetOwnerID()
    {
        return _customerID;
    }

    public Phone<Customer> Phone { get; set; }
}

Phone の GetOwnerID() は現在、所有者の GetOwnerID() の結果を返す方法がないため、これはコンパイルされません。クライアントの観点からの最終結果が次のようになることを願っています。

Account myAccount = new Account();
myAccount.AccountID = 10;

int ownerID = myAccount.Phone.GetOwnerID(); //this would return 10.
4

2 に答える 2

4

なぜこれをやりたいのかを自問する必要があると思います。

本当にたくさんの異なる型が必要で、そのすべてがPhone契約を満たしている場合は、インターフェースと、おそらく抽象基本実装を使用することをお勧めします。

public interface IPhone
{
    int PhoneID {get;set;}
    string PhoneNumber {get;set;}
}

public abstract AbstractPhoneBase : IPhone
{
    public int PhoneID {get;set;}
    public string PhoneNumber {get;set;}
}

public CustomerPhone : AbstractPhoneBase
{
    public int CustomerID {get;set;}
}
于 2012-11-28T21:19:45.943 に答える
0

あなたの例は問題ないと思います-IUsePhone(Account、Customerなど)を実装する所有者のインスタンスを取り込むコンストラクターが欠けているだけです。

Phone<T>これをクラスに追加してみてください。

    public IUsePhone Owner { get; private set; }

    public Phone(T owner)
    {
        this.Owner = owner;
    }

    public int GetOwnerID()
    {
        return this.Owner.GetOwnerID();
    }

注: この例では、呼び出す前に Phone プロパティを設定する必要があることを忘れないでくださいmyAccount.Phone.GetOwnerID();

この方法で実行している場合は、既に提案されている抽象基本クラスのルートをたどり、次の行に沿って基本メソッドに Phone を設定します。

public virtual void SetPhoneNumber<T>(string number)
    {
        this.Phone = new Phone<T>(this);
        this.Phone.Number = number;
    }

したがって、使用法は次のようになります。

    Account myAccount = new Account();
    myAccount.AccountID = 10;

    myAccount.SetPhoneNumber("123456");

    int ownerID = myAccount.Phone.GetOwnerID(); // this would return 10.
于 2012-11-28T21:38:04.513 に答える