OS设计问题:程序关联的文件类型

我在用Unity3D和C#来建立一个伪游戏操作系统
UA Crosslink
请注意这是一个纯粹的设计问题,没有Unity相关知识也可以回答。
这是我所拥有的:
概要文件夹,有子:

  1. TextFile
  2. MediaFile
  3. ImageFile

另外,概要应用,有子:

  1. TextViewer
  2. MediaPlayer
  3. ImageViewer

很明显,TextViewer应该打开TextFile, MediaPlayer应该打开MediaFile,ImageViewer应该打开ImageFile。
现在,我想了一会,我应该把“谁打开谁”这一信息放在哪里?在文件夹里创建一个开始概要,并在子文件夹重写?我认为那没有意义,因为一个文件夹,不会知道去打开它自己,是应用知道怎样打开一个文件夹。例如:一个PDF文件,如果没有PDF Reader(Adode或者其他的什么),你就不能打开PDF。
这意味着TextViewer应该有一个打开(TextFile文本)的方法,MediaPlayer应该有一个打开(MediaFile媒体)的方法,ImageViewer应该有个打开(ImageFile图片)的方法。
这可以在应用程序声明中通过泛型来实现,例如:

public abstract class Application<T> where T : FILE
{
  public abstract void Open(T file);
}

然后

public class TextViewer : Application<TextFile>
{
    public override void Open(TextFile file)
    {
        Console.WriteLine("TextViewer opening text file...");
    }
}

public class MediaPlayer : Application<MediaFile>
{
    public override void Open(MediaFile file)
    {
        Console.WriteLine("MediaPlayer opening media file...");
    }
}

public class ImageViewer : Application<ImageFile>
{
    public override void Open(ImageFile file)
    {
        Console.WriteLine("ImageViewer opening image file...");
    }
}

这是UML表的大概样子:

看起来还不错,现在到了有趣的部分,怎样绑定/关联每个文件类型,用正确的程序打开?也就是说,邮件单机文本文件| 出现选择列表"Open", "Rename", "Delete"等| 选择 "Open" – 接下来发生什么?
我想到一个主意,在文件和应用之间调停,想一下,一个真正的操作西戎,就像Windows那样是如何做的?如果执行开始| 默认程序| 关联文件类型或关联程序协议,你将看到一个字典类型列表,有键(文件类型)和值(关联程序),我想到了那样做,创建一个字典,用它注册,应用程序文件类型,这就是我遇到问题的地方。
第一,我的字典里应该用什么样的键和值?我想了一下,觉得应该类似<Type, Application>,但是问题是,我不能只写应用程序本身,我地指定泛型T参数。
我的对应方法是创建inbetweener类应用,然后让应用从它继承:

public abstract class App { }

public abstract class Application <T> : App where T : FILE { /* stuff... */ }

OK, 现在我的字典是 <Type, App>了:

public static class Mediator
{
    static private TextViewer tv;
    static private MediaPlayer mp;
    static private ImageViewer iv;
    static private Dictionary<Type, App> dic = new Dictionary<Type, App>();

    static Mediator()
    {
        tv = new TextViewer();
        iv = new ImageViewer();
        mp = new MediaPlayer();

        // register what we have
        dic.Add(typeof(TextFile), tv);
        dic.Add(typeof(MediaFile), mp);
        dic.Add(typeof(ImageFile), iv);
    }

    static public void Open(FILE file)
    {
        App app = dic[file.GetType()];
        if (app == null)
        {
            Console.WriteLine("No application was assigned to open up " + file);
            return;
        }

        app. //这是我无法应付的地方, APP离没有打开方法
    }
}

哎呀,那不起作用!如你所见,我在尽我所能避免如下的事情:

if (file is TextFile)
  // 用text viewer打开
else if (file is MediaFile)
  // 用media player打开
else if (file is ImageFile)
  // 用image viewer打开
else if etc

这对我来说简直就是一场噩梦。
我可以制作我的应用程序单例来避免所有麻烦,,所以现在每个文件夹里:

public class TextFile : FILE
{
   public override void Open()
   {
      TextViewer.Instance.Open(this);
   }
}

对于文件的其他部分也这样。但是我不想那样做,我不想放弃,不想使用单例,如果我想让MediaPlayer或者TextViewer0有不止一个实例该怎么办呢?
我已经纠结这一点很久了,我希望我把我的问题表述清楚了。我只是想知道,关联文件类型的应用程序如何正确工作(例如,就像Window一样)?我怎样才能优雅的实现功能强大的效果?是否有我可以使用的设计类型?我的上述所有尝试,想法是对的吗?我接近正确答案了吗?感谢一切助我推进的建议。

原问题:An OS design issue: File types associated with their appropriate programs

查看回复