【问题标题】:Polymorphism: Deriving from a protected member in a base class?多态性:从基类中的受保护成员派生?
【发布时间】:2012-05-14 04:53:29
【问题描述】:

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

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

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

Media 是代表所有媒体文件的抽象基类。 电影继承自 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,因此代码会生成错误。

所以把我的问题总结成一个更通用的问题:在派生类中,我如何从基类中的受保护基变量派生?

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

【问题讨论】:

    标签: c# polymorphism


    【解决方案1】:

    您可以将基类设为其包含的 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; }
        }
    }
    

    【讨论】:

    • @Daniel - 我认为泛型是您给出的结构的唯一(类型安全)解决方案。如果您可以将info 字段移出MovieInfo 类并移到其子类中,则可以采用非通用方式。
    【解决方案2】:

    这是一个非通用的替代方案:

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

    视情况而定,这可能会也可能不会比 Lee 的解决方案更好。我个人更喜欢他的,只是一般地思考。

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 2016-04-07
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 2012-08-29
      • 2018-11-27
      相关资源
      最近更新 更多