我正在为基本的媒体播放器编程,但在编写多态代码时遇到了一些麻烦,这是我研究过的,但以前从未真正实现过。
有四个相关的类: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/