多個版本在你的公司,說你有下面的代碼:如何使用仿製藥,而不是繼承有什麼
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;}
}
什麼這是應該的意思是,我們有多種類型的手機,有些是客戶電話,一些帳戶電話等...
問題是「這是可能的,如果是這樣,那麼怎麼樣?」看起來最簡單的方法就是擁有一個可插入類型的通用Phone類,然後在需要時使用該類型的信息(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.
編譯和運行時被混淆了。鑑於缺少更好的東西,可以使用'return default(T)'進行編譯,儘管這不是非常有用。考慮是否有「SetPhone(IUsePhone ..)」方法。請注意,即使他們在'IUsePhone'上工作,'賬戶/客戶'也不會統一到'電話'。 –
2012-11-28 21:18:04
這可能聽起來很愚蠢,實際上可能沒有辦法做我正在談論的事情。我希望不必像你提到的那樣使用反射或依賴注入(通過SetPhone方法)。我越想越想,一旦你把這兩個選項拿走,看起來就越不可能,但我知道有一些真的很聰明在那裏的人,所以我認爲這是值得一試。 – IWriteApps
這看起來像工廠模式的工作(http://www.dofactory.com/Patterns/PatternFactory.aspx) –