c# जेनेरिक - क्या सी#जेनरिक के पास एक विशिष्ट आधार प्रकार हो सकता है?




मेडिसिन लिस्ट (5)

क्या एक सामान्य इंटरफ़ेस के प्रकार के लिए एक विशिष्ट अभिभावक वर्ग पर आधारित होना संभव है?

उदाहरण के लिए:

public interface IGenericFace<T : BaseClass>
{
}

जाहिर है उपरोक्त कोड काम नहीं करता है, लेकिन अगर ऐसा होता है, तो मैं संकलक को बताने की कोशिश कर रहा हूं कि T BaseClass का उप-वर्ग होना चाहिए। क्या यह किया जा सकता है, क्या इसके लिए योजनाएं हैं, इत्यादि?

मुझे लगता है कि यह एक विशिष्ट परियोजना के संदर्भ में उपयोगी होगा, यह सुनिश्चित कर लें कि संकलित समय पर अनपेक्षित प्रकार (ओं) के साथ एक सामान्य इंटरफ़ेस / कक्षा का उपयोग नहीं किया जाता है। या स्वयं-दस्तावेज़ की तरह भी: दिखाएं कि किस तरह का प्रकार इरादा है।


Answers

public interface IGenericFace<T> where T : SomeBaseClass

हाँ।

public interface IGenericFace<T>
    where T : BaseClass
{
}


आप जो कह रहे हैं उसे "सामान्य बाधा" कहा जाता है। ऐसी कई बाधाएं हैं जिन्हें सामान्य प्रकार पर रखा जा सकता है।

कुछ बुनियादी उदाहरण निम्नानुसार हैं:

  • where T: struct - प्रकार तर्क एक मान प्रकार होना चाहिए। Nullable को छोड़कर कोई भी मूल्य प्रकार निर्दिष्ट किया जा सकता है। अधिक जानकारी के लिए Nullable प्रकार (सी # प्रोग्रामिंग गाइड) का उपयोग देखें।

  • where T : class - प्रकार तर्क एक संदर्भ प्रकार होना चाहिए; यह किसी भी वर्ग, इंटरफ़ेस, प्रतिनिधि, या सरणी प्रकार पर भी लागू होता है।

  • where T : new() - प्रकार तर्क में सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए। जब अन्य बाधाओं के साथ एक साथ उपयोग किया जाता है, तो new() बाधा अंतिम निर्दिष्ट की जानी चाहिए।

  • where T : <base class name> - टाइप तर्क निर्दिष्ट बेस क्लास से होना चाहिए या प्राप्त होना चाहिए।

  • where T : <interface name> - प्रकार तर्क निर्दिष्ट इंटरफ़ेस होना या लागू करना चाहिए। एकाधिक इंटरफ़ेस बाधाओं को निर्दिष्ट किया जा सकता है। बाधा इंटरफेस भी सामान्य हो सकता है।

  • where T : U - T लिए आपूर्ति प्रकार तर्क U लिए दिए गए तर्क से होना चाहिए या प्राप्त होना चाहिए। इसे नग्न प्रकार की बाधा कहा जाता है।

इन्हें इस तरह से जोड़ा जा सकता है:

सी#

public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { }
public interface IGenericFace<T> where T : SomeBaseClass

वीबी

Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New})
Public Interface IGenericInterface(Of T As SomeBaseClass)

नीचे दो विकल्प हैं जिनका आप उपयोग कर सकते हैं

return default(T);

या

where T : class, IDisposable
 return null;




c# generics