簡體   English   中英

多態性:從基類中的受保護成員派生?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM