Вопрос о синтаксисе где в определении класса - PullRequest
2 голосов
/ 24 сентября 2011

Я начал реализовывать шаблон репозитория, следуя этому учебнику .Теперь в определении класса, который реализует интерфейс репозитория.Определения классов сделаны следующим образом.

public class Repository<E,C> : IRepository<E,C>, IDisposable 
    where E : EntityObject
    where C : ObjectContext
{
}

Может кто-нибудь объяснить мне, если я определил класс с дженериками, почему мне нужно ввести where, чтобы объяснить, какие объекты ожидаются?,Я действительно запутался в этой теме

Ответы [ 5 ]

1 голос
/ 24 сентября 2011

Ограничение типов с помощью where - это преднамеренный выбор, который имеет два следствия:

  1. Компилятор не позволит вам написать код, который создает экземпляр универсального типа, если параметры типа не удовлетворяют этимограничения и взамен
  2. Это позволит вам использовать объекты класса E и C в качестве EntityObject и ObjectContext в пределах определения Repository<,>;в противном случае он не позволит вам получить доступ к членам (методам, свойствам и т. д.) этих классов, потому что он не сможет гарантировать, что эти члены существуют в типах, используемых для определения универсального.
1 голос
/ 24 сентября 2011

where указывает, что можно использовать - в вашем примере E должно быть EntityObject (или что-то, производное от EntityObject), а C должно быть ObjectContext (или что-то, производное от ObjectContext).Это набор ограничений, вот и все.Как правило, это делается потому, что у класса (в данном случае Repository) есть некоторые ожидания, которые необходимо оправдать, по крайней мере, так я его и использовал.

1 голос
/ 24 сентября 2011

Что происходит, так это то, что родовые типы ограничены этим типом или любым типом, производным от этого типа.Это сделано для того, чтобы определенные методы, свойства, события, поля и т. Д. Стали доступны для универсальных шаблонов и не позволяли использовать типы, не соответствующие форме этих ограничений.1003 * Общие ограничения .

0 голосов
/ 24 сентября 2011

Здесь вы определяете ограничение общего типа, а не то, какие типы ожидаются.

Таким же образом вам может потребоваться определенный тип, интерфейс, который должен быть реализован вашим ожидаемым типом, базовыйclass, абстрактный класс или вы можете ограничить параметр (ы) типа также как ссылочный тип (where T : class).

Эта ссылка может быть полезной: Ограничения на параметры типа

0 голосов
/ 24 сентября 2011

почему мне нужно вводить, где объяснить, какие объекты ожидаются?

Вы не говорите, какие объекты ожидаются.Вы ограничиваете типами для некоторого типа, который выводит из этого типа объекта.Однако это может быть определенный подкласс этого объекта.

...