传递给子类的C#模式?

时间:2019-05-15 19:16:19

标签: c# unity3d design-patterns

给出一个虚拟模拟的平板电脑来启动从类App继承的FooApp和BarApp之类的应用程序,那么告诉功能LaunchApp(...)启动哪个应用程序的好方法是什么?

我当前正在传递LaunchApp(System.Type appType),其中appType例如typeof(FooApp),然后在函数中进行验证。但是,这种模式似乎缺乏适当的类型安全性和通过自动完成舒适性。另一方面,我使用一个Enum然后通过例如转换为appType的替代模式。开关盒,似乎不符合D.R.Y.因为我需要保留另一个冗余的appType枚举列表。什么是这里的好模式?

1 个答案:

答案 0 :(得分:1)

据我了解,您希望根据对象的类型调用不同的方法。但是不想引入一个新的枚举来帮助决定调用哪种方法。

为此,我建议您可以使用在较新的C#版本中使用的类型模式。它在哪里投射对象类型并为该特定类型运行开关盒。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch

这是他们在文档中使用的示例。

private static void ShowCollectionInformation(object coll)
    {
        switch (coll)
        {
            case Array arr:
               Console.WriteLine($"An array with {arr.Length} elements.");
               break;
            case IEnumerable<int> ieInt:
               Console.WriteLine($"Average: {ieInt.Average(s => s)}");
               break;   
            case IList list:
               Console.WriteLine($"{list.Count} items");
               break;
            case IEnumerable ie:
               string result = "";
               foreach (var e in ie) 
                  result += "${e} ";
               Console.WriteLine(result);
               break;   
            case null:
               // Do nothing for a null.
               break;
            default:
               Console.WriteLine($"A instance of type {coll.GetType().Name}");
               break;   
        }
    }