[英]Polymorphism: Deriving from a protected member in a base class?
我正在編寫一個基本的媒體播放器,我在編寫多態代碼時遇到了一些麻煩,這是我研究過的,但之前從未真正實現過。
有四個相關的類:MediaInfo,MovieInfo,Media和Movie。
MediaInfo是一個抽象基類,用於保存與所有媒體文件相關的信息。 MovieInfo繼承自MediaInfo並添加一些特定於視頻文件的信息。
Media是一個抽象基類,表示所有媒體文件。 電影繼承自媒體。
現在,Media包含以下代碼行:
protected MediaInfo info;
在Media Media中,我有Accessors從MediaInfo中提取信息。 但是,在Movie中,我想讓Accessor也從MovieInfo中提取信息。
所以我在Movie中做的是:
protected MovieInfo info;
並在構造函數內:
this.info = new MovieInfo(path);
但是,現在我有了一個Accessor:
/// <summary>
/// Gets the frame height of the movie file.
/// </summary>
public string FrameHeight
{
get
{
return this.info.FrameHeight;
}
}
問題是,FrameHeight是一個僅在MovieInfo中可用的訪問器。 this.info被視為MediaInfo,盡管我將其聲明為MovieInfo,因此代碼會生成錯誤。
因此,將我的問題總結為一個更通用的問題:在派生類中,如何從基類中的受保護基礎變量派生?
對不起,如果這有點令人困惑,我很樂意澄清任何不清楚的細節。
您可以使其包含的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; }
}
}
這是一個非通用的替代方案:
protected MovieInfo info { get { return (MovieInfo)base.info; } }
根據具體情況,這可能會或可能不會比李的解決方案更好。 我個人更喜歡他,只是一般地思考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.