2012-01-13 16 views
10

मेरे पास एक इंटरफ़ेस और दो प्रकार हैं जो इससे प्राप्त होते हैं।(उसी) इंटरफ़ेस से व्युत्पन्न दो प्रकारों के बीच कास्टिंग

हालांकि, मैं ऐसा नहीं कर सकते निम्नलिखित:

B objectB = (B) objectA 

कहाँ बी objectA (ग्रुप ए की है जिसके लिए Interface1 से निकला है (मैं वर्ग के नाम को बनाने रहा हूं, लेकिन बात अभी भी खड़ा है), और इसी तरह)। मैं निम्न त्रुटि संदेश मिलता है:

, बी

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

उत्तर

34
  1. प्रकार इंटरफ़ेस से प्राप्त नहीं करते हैं। वे एक इंटरफ़ेस लागू करें।
  2. तथ्य यह है कि एक हाथी और स्पाइडर दोनों जानवर हैं का मतलब यह नहीं है कि आप एक दूसरे को परिवर्तित कर सकते हैं।
+11

के मुकाबले मेरे लिए अप्रासंगिक होगा, मुझे वास्तव में इसकी कमी पसंद है उत्तर - सभी आवश्यक जानकारी आसानी से, स्पष्ट रूप से और स्पष्ट रूप से –

+5

पर प्राप्त होती है उत्तरार्द्ध एक विशेष रूप से महत्वपूर्ण बिंदु है; स्पाइडर-सूअर पहले से ही खतरनाक थे। –

6

आप डाली नहीं कर सकते या A से B में बदलने का है, तो सब वे का हिस्सा एक आम इंटरफ़ेस जब तक आप वास्तव में अपने खुद रूपांतरण ऑपरेटर को परिभाषित है, तो आप प्रकारों में से एक के लिए स्रोत को नियंत्रित संभालने, या किसी अन्य प्रदान की गई उपयोगकर्ता-निर्धारित रूपांतरण की आपूर्ति का उपयोग किसी ऐसे व्यक्ति द्वारा स्रोत को नियंत्रित करता है। (हालांकि, इस तरह उपयोगकर्ता के निर्धारित रूपांतरण का मूल वस्तु की रक्षा करेगा नहीं। एक वस्तु रूपांतरण में चला जाता है, एक अलग वस्तु बाहर आता है।)

आप Interface1 करने के लिए A से Interface1 करने के लिए B में बदल सकते हैं, और। लेकिन दो प्रकार के सामान्य माता-पिता को साझा करने से दो प्रकार के परिवर्तनीय एक दूसरे को नहीं बनाते हैं।

A a = new A(); 
B b = new B(); 
Interface1 obj1 = a; // legal 
Interface1 obj2 = b; // legal 
B obj3 = (B)a; // not legal, a is simply not a B 

tobias86 नीचे एक टिप्पणी में अच्छी तरह से रखा गया है, आपके पास बिल्ली और कुत्ता है। दोनों Animal से निकले हैं। लेकिन एक बिल्ली सिर्फ एक कुत्ता नहीं है।


विस्तार के रूप में, आप इस बात से संघर्ष कर रहे हैं कि आप कैसे और क्यों इंटरफ़ेस का उपयोग करेंगे। आप ए के लिए ए को प्रतिस्थापित करने के लिए इंटरफ़ेस का उपयोग नहीं करते हैं, या ए के लिए बी को चुनते हैं। आप इसे इंटरफेस 1 के लिए या तो ए या बी को प्रतिस्थापित करने के लिए उपयोग करते हैं। यह वह इंटरफ़ेस है जिसे आप उम्मीद करते हैं, और ए या बी जो आप आपूर्ति कर सकते हैं। यह देखते हुए:

public void DoSomething(Interface1 obj) { } // expects 
DoSomething(new A()); // you can supply A 

या

public Interface1 GetSomething() // callers expect to get 
{ 
    return new B(); // you can supply a B 
} 

यह इंटरफ़ेस आप की ओर प्रोग्रामिंग कर रहे हैं, ए और बी केवल कार्यान्वयन हैं रहा है। आप सोच रहे होंगे कि आप किसी बी को बी से पास कर सकते हैं जो उम्मीद करता है। उम्मीद को संभवतः बदलने की जरूरत है।

+7

+1। कुत्ता == पशु और बिल्ली == पशु, लेकिन कुत्ता! = बिल्ली। :) – tobias86

+0

उत्कृष्ट समानता, tobias। –

+0

उचित नहीं है ... न केवल उसका नाम मेरा जैसा ही है, लेकिन उसके विचार भी हैं (मेरा जवाब देखें)>< – Nuffin

1

जब बी बी करने के लिए एक से कास्टिंग एक के लिए एक सुपर प्रकार या वस्तु के क्रम प्रकार

यह है कि अगर आपके पास बी जाना चाहिए होना चाहिए

class A : B{} 

आप संकलन की एक वस्तु डाल सकता टाइम टाइप ए से बी। यदि आप ऑब्जेक्ट के रनटाइम प्रकार ए

अपने मामले में दो प्रकार सुपर-उप प्रकार संबंध साझा नहीं करते हैं तो आप बी के लिए एक प्रकार का भीस्ट कर सकते हैं। वे केवल एक सामान्य सुपर प्रकार साझा करते हैं लेकिन यह पर्याप्त नहीं है।

यह उदाहरण के रूप में क्यों काम नहीं कर सकता है (सामान्यतः) Point[] से Dictionary<string,HashSet<byte>> पर संकलक कैसे डाला जाएगा? (दोनों IENumerable लागू करें)

+0

जैसा कि आप ध्यान देते हैं, ए से बी का एक कलाकार कानूनी है और सफल होने की गारंटी है यदि 'बी'' ए' का सुपरटेप है; यह कानूनी है, लेकिन रनटाइम पर विफल हो सकता है, यदि 'बी' उप प्रकार है। हालांकि, एक दिलचस्प नोट यह है कि कास्टिंग सामान्य प्रकारों के बीच वर्जित है, जिनके पास कोई पहचान योग्य उप प्रकार/सुपरटेप व्यवस्था नहीं है, भले ही ऐसे कलाकार सफल हो जाएं। जेनेरिक प्रकार टी: कंट्रोल, कोई भी टी टू बटन का उदाहरण नहीं लगा सकता है, न ही बटन टू टी का एक उदाहरण डाला जा सकता है, हालांकि कोई भी नियंत्रण के लिए एक उदाहरण डाला जा सकता है और फिर उस कास्ट को दूसरे प्रकार के परिणाम कास्ट कर सकता है। – supercat

+0

सुपरकैट सामान्य नियम में एक ही नियम लागू होता है। बटन और टी के बीच कोई सुपर-सबटाइप संबंध नहीं है। टी टी को नियंत्रण के लिए तत्काल अप्रासंगिक है। कंट्रोल पर टी पर बाधा कैसे बदल जाएगी –

+0

@RuneFS: मुझे लगता है कि सुपरकैट जेनेरिक बाधाओं के बारे में बात कर रहा था। लेकिन यहां तक ​​कि आप यह सुनिश्चित नहीं कर सकते कि अब और हमेशा के लिए कभी भी उस प्रकार/विधि का उदाहरण नहीं होगा जो T2: बटन से दूसरे प्रकार के पैरामीटर के साथ बनाया/लगाया गया है, फिर भी यह एक कंपाइलर त्रुटि उत्पन्न करेगा। – Nuffin

3

तथ्य यह है कि दोनों प्रकार एक ही इंटरफ़ेस को लागू करते हैं (या उस मामले के लिए समान आधार-प्रकार है) उन्हें अदला-बदले में नहीं लाता है; एक A हमेशा एक A है, और B हमेशा B है। एक विरासत श्रृंखला में, एक वस्तु को स्वयं या किसी भी मूल प्रकार के रूप में डाला जा सकता है। आपके पास:

A : ISomeInterface 
B : ISomeInterface 

जो आप A या ISomeInterface के रूप में एक A कास्ट कर सकते हैं, और एक BB के रूप में या ISomeInterface

या

SomeBaseType 
> A 
> B 
(के अपने अर्थ "से ली गई" के आधार पर)

जो आपको AA या SomeBaseType, और BB याके रूप में डालने देता है

(प्लस object, प्रत्येक मामले में)

0

आपको बस इतना करना मतलब नहीं है चाहता हूँ क्या। objectAB नहीं है।

0

आप उन्हें केवल इंटरफ़ेस प्रकार में डाल सकते हैं। ए बी नहीं है लेकिन वे दोनों हैं I इसका मतलब है कि आप ए ले सकते हैं और I या B पर जा सकते हैं और मुझे नहीं डाल सकते हैं लेकिन बी नहीं और

0

पर आपको इंटरफ़ेस के रूप में डालने की आवश्यकता है।

interface IBase { } 
class A : IBase { } 
class B : IBase { } 

इसके साथ ही, दो प्रकारों में एकमात्र चीज इंटरफ़ेस सदस्य है। B में ऐसी आइटम हो सकती हैं जो A नहीं है।

A a = new A(); 
B b = new B(); 

IBase aBase = a; 
IBase bBase = b; 

फिर आप IBase इंटरफ़ेस पर कुछ भी कॉल कर सकते हैं।

public interface Human 
{ 
    bool Male { get; } 
} 

public class Man : Human 
{ 
    public bool HasABeard { get { return true; } } 

    public bool IsMale { get { return true; } } 
} 

public class Woman : Human 
{ 
    public bool IsMale { get { return false; } } 

    public List<Pair<Shoe>> Shoes { get; set; } 
} 

क्या आप संकलक निम्न कोड से निर्माण करने के लिए उम्मीद करेंगे:

0

निम्नलिखित सेटअप कल्पना कीजिए? आउटपुट क्या होगा?

Man a; 
Woman b = new Woman(); 
a = (Man)b; 

Console.WriteLine(a.HasABeard ? "Beard ON" : "Beard OFF"); 
संबंधित मुद्दे