我正在为基本的媒体播放器编程,但在编写多态代码时遇到了一些麻烦,这是我研究过的,但以前从未真正实现过。

有四个相关的类:MediaInfo,MovieInfo,Media和Movie。

MediaInfo是一个抽象基类,其中包含与所有媒体文件有关的信息。
MovieInfo继承自MediaInfo,并添加了一些特定于视频文件的信息。

媒体是代表所有媒体文件的抽象基类。
电影是从媒体继承的。

现在,Media包含以下代码行:

protected MediaInfo info;

在Media内部,我具有从MediaInfo提取信息的访问器。
但是,在Movie内部,我希望具有从MovieInfo中提取信息的访问器。

所以我在Movie里面做的是:
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声明为MovieInfo,但它仍被视为MediaInfo,因此代码会生成错误。

因此,将我的问题归纳为一个更通用的问题:在派生类中,如何从基类中 protected 基变量派生?

抱歉,这有点令人困惑,我很乐意澄清任何不清楚的细节。

最佳答案

您可以使基类在它包含的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; }
    }
}

关于c# - 多态性:源自基类中的 protected 成员吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10574692/

10-09 01:59