4

以下を使用して、オブジェクトを親にリンクすることがよくあります。

 Video parent;

さまざまなオブジェクト タイプの子になることができるオブジェクトがある場合があります。

 int parentType;
 Video parentVideo; // if parent == VIDEO then this will be used
 Audio parentAudio; // if parent == AUDIO then this will be used

より良い方法はありますか?異なる型のインスタンスになる可能性のある変数を操作するにはどうすればよいですか?

編集:もちろん、ビデオとオーディオが同じ基本クラス (メディアなど) から継承する場合、次のようにすることができます。

 Media parent;

しかし、親が同じ基底クラスを継承していない場合はどうなるでしょうか?

4

4 に答える 4

8

あなたの質問の型は封印されていると思います。その場合、私は途中object parentで使用して使用します。as(使用asすると、フラグをチェックするよりもパフォーマンスに大きな影響を与える可能性がありますが、... 私が行ったことは問題ではなく、null ガードでも適切に使用できます。)

Video video = null;
if ((video = parent as Video) != null) {
  // know we have a (non-null) Video object here, yay!
} else if (...) {
  // maybe there is the Audio here
}

上記は、実際には、制約のない判別共用体で 1 回限りのパターン一致を記述する愚かな C# の方法です (オブジェクトは、C# の他のすべての型の共用体です:-)

于 2010-07-21T23:18:54.087 に答える
7

一般的には、すべての機能を公開するインターフェイスが適切であり、これがあなたのタイプになる可能性があります。それ以外の場合 (または同様に)、ジェネリックを検討することもできます。

そのようです:

class Something<TMediaType>
    where TMediaType : IMedia // use this statement to limit the types. It
                              // is not required, if not specified it can be 
                              // of any type
{
    TMediaType data;

    // other such things
}
于 2010-07-21T23:14:46.280 に答える
3

物事を好転させてみてください....これはもっと理にかなっていますか?

interface IMedia 
{
  void Play();
  void Stop();
}

class Video : IMedia
{
  public Audio Audio; /// aka child

  public void Play() { }
  public void Stop() { }
}

class Audio : IMedia
{
  public Video Video; /// aka parent...questionable unless Audio 
                      /// always has a parent Video

  public void Play() { }
  public void Stop() { }
}

private void PlayAnyMedia(IMedia media) /// Write against an interface
{
  media.Play();
}
于 2010-07-21T23:46:48.123 に答える
1

派生元の基本クラス Media がなくても、オーディオまたはビデオ コンテンツに同様に適用できる共通の機能がある場合は、オブジェクト コンテンツを受け入れ、特定のコンテンツに応じて異なる操作を実行する新しい MediaContainer クラスを作成できます。コンテンツのタイプ。これが行うことは、醜い「切り替え」機能をラッパーにカプセル化することです。これにより、MediaContainer に依存するコードを記述できるようになり、MediaContainer に含まれる特定のメディアや、呼び出しを委譲するという醜い作業をどのように処理するかを気にする必要がなくなります。

于 2010-07-21T23:30:55.330 に答える