2012-05-13 105 views
7

我正在編程一個基本的媒體播放器,我在編寫多態代碼時遇到了一些麻煩,這是我研究過的,但從未實際執行過。多態性:從基類中的受保護成員派生?

有四個相關的類:MediaInfo,MovieInfo,Media和Movie。

MediaInfo是一個抽象基類,用於保存與所有媒體文件相關的信息。 MovieInfo繼承自MediaInfo並添加了一些特定於視頻文件的信息。

媒體是一個抽象基類,它表示所有媒體文件。 電影從Media繼承。現在

,媒體包含以下代碼行:

protected MediaInfo info; 

內媒體,我有從的MediaInfo提取信息的訪問器。 但是,在Movie裏面,我想要有訪問器,它也從MovieInfo中提取信息。

因此,我所做裏面的電影是:

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; 
    } 
} 

的問題是, FrameHeight是一個只在MovieInfo中可用的訪問器。 this.info被視爲MediaInfo,儘管我將其聲明爲MovieInfo,因此代碼會生成錯誤。

所以總結我的問題到一個更通用的問題:在派生類中,我如何從基類中的受保護的基類變量派生?

對不起,如果這有點令人困惑,我很樂意澄清任何不清楚的細節。

回答

6

你可以做的基類中的MediaInfo它包含的類型一般:

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

然後你可以指定Movie處理MovieInfo類型:

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

@丹尼爾 - 我認爲泛型是您所提供結構的唯一(類型安全)解決方案。如果您可以將'info'字段移出'MovieInfo'類並將其移入其子類,則可以以非通用方式進行操作。 – Lee

1

這裏有一個非一般的選擇:

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

取決於在這種情況下,這可能會或可能不會比李的解決方案更好。我個人喜歡他更好,只是總體思考。

相關問題