2012-05-13 17 views
7

मैं एक बुनियादी मीडिया प्लेयर प्रोग्रामिंग पर काम कर रहा हूं, और मुझे कुछ समस्याएं लिख रही हैं जो पॉलिमॉर्फिक कोड लिख रही हैं, जो मैंने पढ़ा है, लेकिन वास्तव में पहले कभी लागू नहीं किया गया है।पॉलिमॉर्फिज्म: बेस क्लास में संरक्षित सदस्य से प्राप्त करना?

चार प्रासंगिक वर्ग हैं: मीडियाइन्फो, मूवीइन्फो, मीडिया, और मूवी।

मीडियाइन्फो एक सार आधार श्रेणी है जिसमें सभी मीडिया फ़ाइलों के लिए प्रासंगिक जानकारी होती है। मूवीइन्फो MediaInfo से विरासत में आता है और कुछ जानकारी जो वीडियो फ़ाइलों के लिए विशिष्ट है जोड़ता है।

मीडिया एक सार आधार वर्ग है जो सभी मीडिया फ़ाइलों का प्रतिनिधित्व करता है। मूवी मीडिया से विरासत में है।

protected MediaInfo info; 

अंदर मीडिया, मैं पहुंचकर्ता कि MediaInfo से जानकारी निकालने के लिए है:

अब, मीडिया में निम्न कोड पंक्ति में शामिल है। हालांकि, मूवी के अंदर, मैं एक्सेसर्स रखना चाहता हूं जो मूवीइन्फो से जानकारी निकालते हैं।

तो क्या मैं फिल्म के अंदर किया था:

protected MovieInfo info; 

और निर्माता के अंदर:

this.info = new MovieInfo(path); 

हालांकि, अब मैं एक्सेसर है:

/// <summary> 
/// Gets the frame height of the movie file. 
/// </summary> 
public string FrameHeight 
{ 
    get 
    { 
     return this.info.FrameHeight; 
    } 
} 

समस्या है, फ़्रेमहाइट केवल एक एक्सेसर है जो मूवीइन्फो के अंदर उपलब्ध है। इस.info को MediaInfo के रूप में माना जाता है, इस तथ्य के बावजूद कि मैंने इसे मूवीइन्फो के रूप में घोषित किया है, और इसलिए कोड एक त्रुटि उत्पन्न करता है।

इसलिए मेरी समस्या को एक और सामान्य प्रश्न में समेटने के लिए: व्युत्पन्न कक्षा में, मैं बेस क्लास में संरक्षित बेस चर से कैसे प्राप्त करूं?

क्षमा करें अगर यह थोड़ा उलझन में था, तो मुझे किसी अस्पष्ट विवरण को स्पष्ट करने में खुशी होगी।

उत्तर

6

आप आधार वर्ग MediaInfo के प्रकार इसमें में सामान्य बना सकता है:

public abstract class Media<T> where T : MediaInfo 
{ 
    protected T info; 
} 

तो फिर तुम निर्दिष्ट कर सकते हैं कि MovieMovieInfo प्रकार संभालता है:

public class Movie : Media<MovieInfo> 
{ 
    public string FrameHeight 
    { 
     get { return this.info.FrameHeight; } 
    } 
} 
+1

@ डैनियल - मुझे लगता है कि जेनेरिक आपके द्वारा दी गई संरचना के लिए एकमात्र (प्रकार-सुरक्षित) समाधान है। यदि आप 'जानकारी' फ़ील्ड को 'मूवीइन्फो' कक्षा से और इसके उप-वर्गों में स्थानांतरित कर सकते हैं तो आप इसे गैर-सामान्य तरीके से कर सकते हैं। – Lee

1

यहाँ एक गैर सामान्य विकल्प है:

protected MovieInfo info { get { return (MovieInfo)base.info; } } 

निर्भर स्थिति पर, यह ली के समाधान से बेहतर हो सकता है या नहीं भी हो सकता है। मैं व्यक्तिगत रूप से सोचता हूं, आम तौर पर सोच रहा हूं।