Что означает такой синтаксис в C #? - PullRequest
6 голосов
/ 15 апреля 2010

Что означает такой синтаксис в C #?

public abstract class HostFactory<TApp> : ServiceHostFactory
        where TApp : IFoo

Ответы [ 4 ]

17 голосов
/ 15 апреля 2010

HostFactory - это открытый универсальный класс (производный от ServiceHostFactory) с единственным аргументом универсального типа с именем TApp, где любой предоставленный TApp должен реализовывать интерфейс IFoo (предостережение: шаблон IWhatever) это просто соглашение; IFoo может быть классом, я полагаю). Тип HostFactory<TApp> не является конкретным типом; он должен быть дополнительно разделен на подклассы, чтобы его можно было создать - предположительно такими вещами, как показано ниже (хотя общего подкласса также будет достаточно):

public class BarHostFactory : HostFactory<Bar> {}
public class Bar : IFoo {...}
3 голосов
/ 15 апреля 2010
2 голосов
/ 15 апреля 2010

Много здесь происходит, и мне интересно, если это домашнее задание из-за «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.

2 голосов
/ 15 апреля 2010

Он говорит, что HostFactory имеет универсальный тип TApp и что он наследует от ServiceHostFactory, а ключевое слово where указывает, что TApp является константой.

В C # 2.0 вы используете ключевое слово where для определения ограничения. Используйте ключевое слово where в параметре универсального типа, за которым следует двоеточие деривации, чтобы указать компилятору, что параметр универсального типа реализует определенный интерфейс.

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...