7

私は基本的なメディアプレーヤーのプログラミングに取り組んでおり、ポリモーフィックコードの記述に問題があります。これは私が研究したことですが、実際に実装したことはありません。

関連するクラスは、MediaInfo、MovieInfo、Media、Movieの4つです。

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として扱われるため、コードでエラーが発生します。

それで、私の問題をより一般的な質問に要約すると、派生クラスで、基本クラスの保護された基本変数からどのように派生するのですか?

これが少し紛らわしい場合は申し訳ありませんが、不明確な詳細があれば喜んで明確にします。

4

2 に答える 2

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; }
    }
}
于 2012-05-13T19:57:06.273 に答える
1

一般的でない代替案は次のとおりです。

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

状況に応じて、これはLeeのソリューションよりも優れている場合とそうでない場合があります。私は個人的に彼の方が好きで、一般的に考えています。

于 2012-05-13T20:53:29.087 に答える