我正在编写一个基本的媒体播放器,我在编写多态代码方面遇到了一些麻烦,这是我研究过的,但之前从未真正实现过。
有四个相关的类:MediaInfo,MovieInfo,Media和Movie。
MediaInfo是一个抽象基类,用于保存与所有媒体文件相关的信息。 MovieInfo继承自MediaInfo并添加了一些特定于视频文件的信息。
Media是一个抽象基类,代表所有媒体文件。 电影继承自媒体。
现在,Media包含以下代码行:
protected MediaInfo info;
Inside Media,我有Accessors从MediaInfo中提取信息。 但是,在Movie中,我想让Accessor也从MovieInfo中提取信息。
所以我在电影中做的是:
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,因此代码会生成错误。
因此,将我的问题总结为一个更通用的问题:在派生类中,如何从基类中的受保护基础变量派生?
对不起,如果这有点令人困惑,我很乐意澄清任何不清楚的细节。
答案 0 :(得分:6)
您可以使基类类型为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; }
}
}
答案 1 :(得分:1)
这是一个非通用的替代方案:
protected MovieInfo info { get { return (MovieInfo)base.info; } }
根据具体情况,这可能会或可能不会比李的解决方案更好。我个人更喜欢他,只是一般地思考。