多态性:从基类中的受保护成员派生?

7
我正在编写一个基本的媒体播放器程序,但是我在编写多态代码时遇到了一些问题。虽然我学过这个概念,但以前从未实现过。
有四个相关的类:MediaInfo、MovieInfo、Media 和 Movie。
MediaInfo 是一个抽象基类,保存所有媒体文件相关的信息。MovieInfo 继承自 MediaInfo,并添加了一些特定于视频文件的信息。
Media 是一个抽象基类,代表所有媒体文件。Movie 继承自 Media。
现在,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被视为MediaInfo,尽管我已将其声明为MovieInfo,因此代码会生成错误。
简言之,我的问题可以归纳为一个更一般性的问题:在派生类中,如何从基类中受保护的变量派生?
如果有任何不清楚的地方,请让我知道,很抱歉造成困扰。
2个回答

6
您可以将基类泛型化为包含MediaInfo类型的内容:
public abstract class Media<T> where T : MediaInfo
{
    protected T info;
}

然后,您可以指定电影处理电影信息类型:
public class Movie : Media<MovieInfo>
{
    public string FrameHeight
    {
        get { return this.info.FrameHeight; }
    }
}

1
@Daniel - 我认为泛型是你所给定的结构唯一(类型安全)的解决方案。如果你可以将“info”字段移出“MovieInfo”类并放入其子类,则可以以非泛型方式完成。 - Lee

1

这里有一个非常通用的替代方案:

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

根据情况,这可能比李的解决方案更好或更差。我个人更喜欢他的,只是一般性思考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接