Способ реализации дженериков в .NET требует, чтобы все Foo<T>
вели себя практически одинаково независимо от T
. Помимо прочего, все Foo<T>
должны иметь одни и те же члены, за исключением того факта, что члены могут включать T
в свои определения. Если бы Foo<T>
мог наследовать от T
, знание того, какие члены Foo<T>
выставлялись, требовало бы знания того, какие выставлялись T
члены, которые, конечно, могли бы быть совершенно разными для Foo<Automobile>
и Foo<Cat>
. Если кто-то знает, что Foo<T>
будет использоваться только для типов, которые происходят, например, от. Animal
, можно определить class Foo<T> : Animal where T:Animal
, но это позволит использовать Foo<Cat>
только как Animal
, а не как Cat
.
Однако во многих случаях действительно нужен не тип Foo<T>
, который на самом деле наследует T
, а скорее возможность создать объект, который в основном ведет себя как T
, но с некоторыми отличиями. .NET Framework также не позволяет делать это напрямую, но есть некоторые библиотеки, которые могут автоматически генерировать прокси-объекты для этой цели. При заданном интерфейсе и одном или нескольких объектах, каждый из которых реализует некоторые члены интерфейса и которые в совокупности реализуют их все, генератор прокси создаст (во время выполнения!) новый класс, который содержит ссылки на предоставленные объекты и реализует этот интерфейс. путем создания для каждого метода интерфейса метода класса, который привязывается к соответствующему методу одного из переданных объектов.
Обратите внимание, что хотя метод, создающий эти новые классы, будет универсальным, сами классы таковыми не будут. Возможно, myProxyMaker.Create<IFoo>(IFlyingMammal)
возвращает proxy8675309
, а myProxyMaker.Create<ISwimmingMammal>
возвращает proxy24601
. Поскольку это совершенно разные классы, тот факт, что IFlyingMammal
состоит из членов, отличных от ISwimmingMammal
, не будет проблемой. Тот факт, что классы могут иметь уродливые имена, сгенерированные машиной, не имеет большого значения, поскольку объявляются не переменные типа proxy8675309
или proxy24601
, а вместо этого типы IFlyingMammal
и ISwimmingMammal
.
person
supercat
schedule
31.10.2013
class Holder<T> : T
- person Meirion Hughes   schedule 31.10.2013class Foo<T> : T
- person 56ka   schedule 31.10.2013Has a
илиis a
? - person Hossein Narimani Rad   schedule 31.10.2013