2011-12-30 15 views
8

के बजाय वापस लौटना चाहते हैं, मैंने अपने पैर की उंगलियों पर कदम उठाया है जो मैंने सोचा था कि कोड का एक बहुत ही सरल टुकड़ा था। संहिता शब्दों से बेहतर बोलती है, तो यहां यह है। सी # इंटरफेस और जेनेरिक संयोजन। अपने बेस इंटरफ़ेस

public interface IResponse 
{ 
    IResult Result { get; set; } 
} 

public class Response<T> : IResponse 
    where T : IResult 
{ 
    public T Result { get; set; } 
    // COMPILER ERROR: Property 'Result' cannot be implemented property from interface 'IResponse'. Type should be 'IResult'. 
} 

संकलक, क्योंकि IResponse परिणाम की आवश्यकता है IResult होने के लिए मुझे ऐसा करने की अनुमति नहीं है लेकिन मैं लागू करने कक्षा में जेनरिक का लाभ लेने के और दृढ़ता से परिणाम टाइप करने के लिए टी यह सिर्फ संभव नहीं है चाहता हूँ, या मैं कुछ तुच्छ याद किया है?

public interface IResponse<T> 
    where T : IResult 
{ 
    T Result { get; set; } 
} 

public class Response<T> : IResponse<T> 
    where T : IResult 
{ 
    public T Result { get; set; } 
} 

आप चातुर्य में जेनेरिक पैरामीटर के बिना IResponse इंटरफ़ेस रखना चाहते हैं तुम भी अधिक सजावटी जा सकते हैं,:

उत्तर

11

वे आपको IResponse बहुत सामान्य बनाने के लिए किया है।

public interface IResponse 
{ 
    IResult Result { get; set; } 
} 

public interface IResponse<T> : IResponse 
    where T : IResult 
{ 
    T Result { get; set; } 
} 

public class Response<T> : IResponse<T> 
    where T : IResult 
{ 
    public T Result { get; set; } 

    IResult IResponse.Result 
    { 
     get { return Result; } 
     set { Result = (T)value; } 
    } 
} 

और, आप अपने मूल कार्यान्वयन के करीब रहना चाहते हैं, तो आप IResponse<T> को निकाल देते हैं और निम्नलिखित प्राप्त कर सकते हैं: नीचे दो इंटरफेस है, जहां वर्ग पारदर्शी रूप से भी सामान्य पैरामीटर के बिना इंटरफ़ेस लागू करता है :

public interface IResponse 
{ 
    IResult Result { get; set; } 
} 

public class Response<T> : IResponse 
    where T : IResult 
{ 
    public T Result { get; set; } 

    IResult IResponse.Result 
    { 
     get { return Result; } 
     set { Result = (T)value; } 
    } 
} 
+0

समस्या का प्रयास भी सामान्य है कि मैं किसी अन्य वर्ग मैं कहाँ न यह हाँ मैं उस के बारे में सोचा टी – Arkiliknam

+0

निर्दिष्ट करने के लिए मुझे मजबूर करना चाहते हैं में इसका इस्तेमाल होता है। यही कारण है कि मैंने अभी दूसरे और तीसरे विकल्प जोड़े हैं। –

+0

बस देखा कि आप अपडेट हैं। अच्छा लगता है और कहीं मेरे सिर में दफन किया गया था। उत्तम सामग्री! :) – Arkiliknam

1

आप प्रकार पैरामीटर इस इंटरफेस के लिए पारित रूप में IResponse में परिणाम की IResponse सामान्य और परिवर्तन प्रकार बनाना चाहिए।

public interface IResponse<T> where T : IResult 
{ 
    T Result { get; set; } 
} 

public class Response<T> : IResponse<T> 
{ 
    public T Result { get; set; } 
} 
4

आप सिर्फ ' "जेनरिक का लाभ लेने के" चाहते हैं आप IResponse जरूरत नहीं है।

इंटरफ़ेस एक और समस्या हल कर रहा है, जो आपकी इच्छा के अनुरूप नहीं है। पर विचार करें

IResponse r = x ? new Response<int>() : new Response<string>(); 
r.Result = ... // what type? 

तो या तो IResponse सामान्य भी कर या इसे पूरी तरह हटा दें।

1
public interface IResponse<T> where T : IResult 
{ 
    T Result { get; set; } 
} 

public class Response<T> : IResponse<T> where T : IResult 
{ 
    public T Result { get; set; } 
    // NO MORE COMPILER ERROR 
} 
2

इंटरफेस बनाने के साथ इस

public class Response<T> : IResponse 
    where T : IResult 
{ 
    public T Result { get; set; } 
    // COMPILER ERROR: Property 'Result' cannot be implemented property from interface 'IResponse'. Type should be 'IResult'. 

    IResult IResponse.Result 
    { 
     get { return this.Result; } 
     set { this.Result = (T)value; } 
    } 
} 
संबंधित मुद्दे