你如何使用多种类型的变量?

时间:2010-07-21 23:11:48

标签: c# types strong-typing base-class

我经常使用以下方法将对象链接到父母:

 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 个答案:

答案 0 :(得分:9)

我假设你问题中的类型是密封的。在这种情况下,我只会使用object parent并在出路时使用as。 (使用as可以比检查标志具有更高的性能影响,但是......在我做过的任何事情中都不是问题,它也可以很好地用在空值保护中。)

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
}

以上实际上只是一种愚蠢的C#方式,在无约束的歧视联盟上编写一次性模式匹配(对象是C#中其他所有类型的联合: - )

答案 1 :(得分: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
}

答案 2 :(得分: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();
}

答案 3 :(得分:1)

如果没有可以从中派生的基类Media,但是有一些通用功能可以同样适用于音频或视频内容,那么您可以创建一个新的MediaContainer类,它接受对象内容并执行不同的操作,具体取决于关于特定类型的内容。这样做是将丑陋的“切换”功能封装到包装器中,以便您可以编写依赖于MediaContainer的代码,而无需担心它包含的特定媒体或它如何处理委派调用的丑陋工作。