यहाँ इंटरफेस को बदलने के लिए एक समाधान है इंटरफ़ेस परिवर्तनों का समर्थन करने के लिए और बाद में परीक्षण के लिए प्रत्येक को कुछ गुण जोड़ना:
class StoreOrder: IOrder<StoreOrder, StoreOrderItem>
{
public DateTime Date { get; set; }
public IList<StoreOrderItem> Items { get; set; }
}
class StoreOrderItem : IOrderItem<StoreOrder>
{
public string ItemName { get; set; }
public decimal ItemPrice { get; set; }
public StoreOrder Parent { get; set; }
}
... और अब StoreOrder
और StoreOrderItem
उदाहरणों बनाने, और उनके माध्यम से ज्ञान प्राप्त उन्हें डाल:
void Main()
{
var so = new StoreOrder { Date = DateTime.Now };
var item = new StoreOrderItem {
Parent = so,
ItemName = "Hand soap",
ItemPrice = 2.50m };
so.Items = new [] { item };
Console.WriteLine(item.Parent.Date);
Console.WriteLine(so.Items.First().ItemName);
}
... जब रन मुद्रित:
3/16/2012 10:43:55 AM
Hand soap
एक अन्य विकल्प है उपरोक्त स्क्रैप करने के लिए और this solution लें और वांछित प्रकार के साथ अभिभावक संपत्ति जोड़कर और कॉल-साइट पर कास्टिंग से बचने के लिए स्पष्ट इंटरफ़ेस कार्यान्वयन का उपयोग करके इसे बदलें, इस तरह की एक StoreOrderItem
कार्यान्वयन कुछ के लिए कर रही है:
class StoreOrderItem : IOrderItem
{
public string ItemName { get; set; }
public decimal ItemPrice { get; set; }
public StoreOrder Parent { get; set; } // note: original implementation
IOrder<IOrderItem> IOrderItem.Parent { // explicit interface implementation
get { return (IOrder<IOrderItem>)this.Parent; }
set { this.Parent = (StoreOrder)value; }
}
}
ऊपर की मेरी पसंदीदा IOrder
को दो सामान्य मापदंडों और IOrderItem
पर स्वेच्छापूर्ण सामान्य पैरामीटर के साथ ऊपर पहला प्रस्ताव है। एक पिछले संस्करण जिसे मैंने पोस्ट किया था और अब संपादित किया है, दोनों एक ही दो सामान्य प्रकारों के साथ एक ही बाधाओं के साथ इंटरफेस करते थे।मुझे लगा जैसे यह थोड़ा ओवरबोर्ड जा रहा था इसलिए मैंने इसे उपर्युक्त कार्यान्वयन पर वापस देखा। यद्यपि TOrder
पर बाधाओं की पूरी कमी है, IOrderItem
पर पैरामीटर टाइप करें - इसके स्थान पर अन्य प्रकारों को झुकाव करने का प्रयास (उदाहरण के लिए, object
) परिणामस्वरूप संकलन त्रुटियों में आया। TOrder
का उपयोग करके इसे T
कॉल करने के बजाय प्रकार की बाधा की अनुपस्थिति में अपेक्षित प्रकार के बारे में एक संकेत प्रदान करता है। यह मेरा अंतिम संपादन होगा - मुझे लगता है कि यह मेरे प्रयासों का सबसे संक्षिप्त है; यदि आप उत्सुक हैं तो मैं पूर्व कार्यान्वयन प्रदान कर सकता हूं जिसमें इंटरफेस पर डबल-जेनेरिक-बाधित-प्रकार थे, लेकिन कम से कम यह मेरा समाधान पसंद करता है। चियर्स!
[यह आपके लिए दिलचस्प हो सकता है] (http://msdn.microsoft.com/en-us/library/dd469487.aspx) – abatishchev