2010-11-01 14 views
16

मैं है एक वस्तु है कि दो इंटरफेस को लागू करता है ... इंटरफेस हैं:एक पैरामीटर के लिए कई इंटरफेस निर्दिष्ट

public class ObjectNode : IObject, ITreeNode<IObject> 
{ 
    public string Class { get; private set; } 
    public string Name { get; private set; } 
    public IEnumerable<IObjectProperty> Properties { get; set; } 
    public IEnumerable<IObject> Children { get; private set; } 
    public IObject Parent { get; private set; } 
} 

अब मैं एक समारोह जिनमें से एक की जरूरत है

public interface IObject 
{ 
    string Name { get; } 
    string Class { get; } 
    IEnumerable<IObjectProperty> Properties { get; } 
} 
public interface ITreeNode<T> 
{ 
    T Parent { get; } 
    IEnumerable<T> Children { get; } 
} 

ऐसी है कि इसके इन दोनों इंटरफेस को लागू करने के लिए पैरामीटर। मैं सी # में निर्दिष्ट करने के बारे में कैसे जाउंगा?

एक उदाहरण

public TypedObject(ITreeNode<IObject> baseObject, IEnumerable<IType> types, ITreeNode<IObject>, IObject parent) 
{ 
    //Construct here 
} 

हो या फिर समस्या यह है कि मेरी डिजाइन गलत है और मैं दोनों को लागू करने की जानी चाहिए एक इंटरफेस किसी भी तरह

+1

"अब मेरे पास एक ऐसा कार्य है जिसके लिए इन दोनों इंटरफेस को लागू करने के लिए इसके एक पैरामीटर की आवश्यकता है।" कार्य या पैरामीटर इंटरफेस लागू नहीं करते हैं, कक्षाएं इंटरफेस लागू करती हैं। आपका क्या अर्थ है? – McKay

+0

संपादन देखें। मुझे पता है कि केवल कक्षाएं इंटरफेस – TerrorAustralis

+0

संभावित डुप्लिकेट लागू कर सकती हैं [क्या पैरामीटर को दो इंटरफेस लागू करना संभव है?] (Http://stackoverflow.com/questions/772053/is-it-possible-to-make-a- पैरामीटर-कार्यान्वयन-दो-इंटरफेस) –

उत्तर

24
public void Foo<T>(T myParam) 
    where T : IObject, ITreeNode<IObject> 
{ 
    // whatever 
} 
+0

यह एक अच्छा जवाब है। मुझे एहसास हुआ कि मैंने सूचना का कुछ महत्वपूर्ण टुकड़ा छोड़ा है। जिस फ़ंक्शन का मैं प्रतिबिंबित कर रहा हूं वह एक और वर्ग के लिए कन्स्ट्रक्टर है (परिदृश्य एक नोड बिल्डिंग एक और नोड है) जेनिक्स का इस्तेमाल कन्स्ट्रक्टर – TerrorAustralis

+1

में किया जा सकता है क्योंकि यह उत्तर मेरे प्रश्न के लिए मान्य है, मैं इसे स्वीकार करूंगा, लेकिन कन्स्ट्रक्टर चीज मुझे कारण दे रही है एक सिरदर्द :) – TerrorAustralis

+0

उस मामले में मुझे लगता है कि आपको क्लास जेनेरिक बनाना होगा। ऐसा लगता है कि आप एक गैर-जेनेरिक वर्ग पर एक सामान्य निर्माता हो सकते हैं। –

13

सी # में पर उन इंटरफेस होगा, इंटरफेस खुद को एक या से विरासत कर सकते हैं अधिक अन्य इंटरफेस। तो एक समाधान इंटरफ़ेस को परिभाषित करना होगा, IObjectTreeNode<T> कहें जो IObject और ITreeNode<T> दोनों से प्राप्त होता है।

+3

-1: यह आवश्यकता को बदल देगा। इस विधि को IObject और ITreeNode को लागू करने के लिए पैरामीटर की आवश्यकता नहीं है, इसके लिए IObjectTreeNode लागू करने के लिए पैरामीटर की आवश्यकता होगी। तो दोनों इंटरफेस को लागू करने वाली वस्तुएं, लेकिन संयुक्त नहीं होने की अनुमति नहीं है, जबकि उन्हें चाहिए। –

-3
public void MethodName<TParam1, TParam2>(TParam1 param1, TParam2 param2) 
    where TParam1 : IObject 
    where TParam2 : ITreeNode<IObject> 
+4

आपने एक पैरामीटर को परिभाषित किया है जो 'IObject' लागू करता है और दूसरा जो' ITreeNode 'लागू करता है, लेकिन मुझे लगता है कि पूछने वाले को एक पैरामीटर की आवश्यकता होती है जो दोनों लागू करता है। –

2

यह शायद एक अंतरफलक है कि दोनों IObject और ITreeNode लागू करता है परिभाषित करने के लिए सबसे आसान है।

public interface IObjectNode<T> : IObject, ITreeNode<T> 
{ 
} 

एक अन्य विकल्प, मामले में आप की उम्मीद नहीं है ऊपर इंटरफ़ेस अक्सर इस्तेमाल किया जाएगा, सामान्य प्रश्न में विधि/समारोह बनाने के लिए है।

public void Foo<T>(T objectNode) where T : IObject, ITreeNode<IObject> 
+0

-1; यह केवल पहले के उत्तरों को दोहराता है और यह स्वीकार नहीं करता है [टिप्पणियों में Stijn द्वारा बताई गई कमी] [http://stackoverflow.com/questions/4073440/specifying-multiple-interfaces-for-a-parameter#comment69322597_4073481) के बारे में पहले दृष्टिकोण। –

संबंधित मुद्दे