Много здесь происходит, и мне интересно, если это домашнее задание из-за «IFoo», или, возможно, вы сделали эту замену, чтобы упростить пример.
- : ServiceHostFactory
, HostFactory наследуется от ServiceHostFactory.
- HostFactory<TApp>
, HostFactory является универсальным типом, так как имеет параметр типа TApp. Всякий раз, когда кто-то использует класс HostFactory, он может указать тип для TApp, что приведет к тому, что этот тип будет использоваться везде, где TApp появляется в коде. Таким образом, если у класса есть функция TApp GetApp()
и они задают <int>
для TApp, то GetApp на самом деле int GetApp()
- where TApp : IFoo
, TApp должен реализовывать интерфейс IFoo (это также мог быть класс, указывая, что он должен наследовать от этого класса, а не напрямую).
- abstract
, HostFactory - это абстрактный класс, то есть другие классы могут наследовать от него, но никакой код не может создать экземпляр самого HostFactory. Это похоже на то, как если бы я давал вам раму автомобиля и говорил, что вам по закону не разрешено водить это по дороге, но вы можете сделать из него свою машину.
- public
HostFactory является общедоступным, что означает, что он виден коду вне сборки, в которой он был объявлен.
Редактировать: Подробнее о дженериках
Я начну с довольно значимой цитаты из MSDN : «Обобщения являются самой мощной функцией C # 2.0».
Вы будете использовать дженерики, когда будете писать что-то, что могло бы работать со многими типами. Например, перед тем, как у нас появились дженерики в 2.0, мы должны были привести все к объекту, прежде чем мы смогли поместить его в коллекцию, что было действительно опасно, потому что копмпилер не мог проверить, что вы приводили к правильному типу всякий раз, когда вы получили предмет из коллекции. С помощью дженериков мы можем сделать ArrayList<bool>
для создания ArrayList из bool's, и теперь нет необходимости приводить. Компилятор может проверить, что мы помещаем bool в коллекцию.
Например, в вышеприведенном классе мы можем написать алгоритмы, которые работают с вещами, которые реализуют IFoo, зная только, что объект сможет делать вещи, которые имеет интерфейс IFoo. Поэтому я могу написать алгоритм, который вызывает методы на интерфейсе IFoo, и в будущем мой алгоритм может быть повторно использован любым, кто реализует интерфейс IFoo.