Шаблон C # для передачи того, что составляет подкласс? - PullRequest
0 голосов
/ 15 мая 2019

Учитывая фактически смоделированный планшет, который запускает приложения, такие как FooApp и BarApp, которые наследуются от класса App, какой будет хороший способ сообщить функции LaunchApp (...), какое приложение запускать?

В настоящее время я передаю LaunchApp (System.Type appType), где appType, например, typeof (FooApp), который затем проверяется внутри функции. Однако, эта модель, кажется, испытывает недостаток в надлежащей безопасности типа и комфорте прохождения автозаполнения. Альтернативный шаблон с другой стороны, где я использую Enum, который затем преобразуется в appType, например, через. случай переключения, кажется, не придерживается D.R.Y. так как мне нужно сохранить другой избыточный список перечисления appType. Что было бы хорошим примером здесь?

1 Ответ

1 голос
/ 15 мая 2019

Как я понимаю, вы хотите, чтобы в зависимости от типа вашего объекта вызывался другой метод. Но не хочу вводить новое перечисление, чтобы помочь решить, какой метод вызывать.

Для этого я предлагаю вам использовать шаблон типа, работающий в более новых версиях 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;   
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...