2013-09-18 2 views
1

я видел некоторые C# asp.net исходный код, написанный ниже:автореферентное родовое наследование в C#

public class EntityInstanceContext<TEntityType> : EntityInstanceContext 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="EntityInstanceContext{TEntityType}"/> class. 
    /// </summary> 
    public EntityInstanceContext() 
     : base() 
    { 
    } 

кто может помочь мне понять, почему общий тип подклассов от необщего один? и что выгодно для этого?

+0

Были ли какие-либо ограничения типа для общего класса? – CodingIntrigue

+0

Описание Microsoft очень ясное! «Экземпляр EntityInstanceContext передается в сборку ссылок (HasIdLink, HasEditLink, HasReadLink) и навигации (HasNavigationPropertyLink, HasNavigationPropertiesLink) и может использоваться разработчиками ссылок для создания ссылок». в чем проблема? –

+1

См. Также IEnnumerable и IEnnumerable ... – tigerswithguitars

ответ

2

.NET TypeSystem является очень мощным. Представьте себе следующий сценарий. Я пишу класс под названием MyTuple который плохо закодированный клон класса BCL Tuple:

public class MyTuple<T1, T2> { 
    public T1 Item1 { get; private set; } 
    public T2 Item2 { get; private set; } 

    public MyTuple(T1 item1, T2 item2) { 
     this.Item1 = item1; 
     this.Item2 = item2; 
    } 
} 

И тогда я понимаю, что я хочу сделать фабричный вид метода для этого типа , так что я могу успешно внедриться в систему вывода типов, а не указать T1 и T2, когда я не должен выглядеть примерно так:

new MyTuple<int, string>(123, "test"); // which is also a bit redundant 

так я пишу метод я говорил в классе, давайте назовем класс Factory :

public class Factory { 

    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) { 
     return new MyTuple<T1, T2>(item1, item2); 
    } 

} 

Таким образом, я счастливее, когда писал:

var tuple = Factory.Create(123, "test"); // and tuple is inferred to be of <int, string> 

Теперь, что произойдет, если я переименовал Factory в MyTuple:

public class MyTuple { 

    public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) { 
     return new MyTuple<T1, T2>(item1, item2); 
    } 

} 

Короче: ничего плохого

Это просто случай, когда я сейчас есть 2 совершенно различных типов:

  • MyTuple (необщей)
  • MyTuple < T1, T2>

Они не имеют ничего общего, они имеют разные типы.

И позвольте ли я сказать, что MyTuple<T1, T2> просто происходит, чтобы продлить MyTuple? Ну, MyTuple не является static или sealed, да, обязательно!

public class MyTuple { ... } 
public class MyTuple<T1, T2> : MyTuple { ... } 

Так что в вашем случае это ничего более, что Mammal расширение Animal или ... Tiger расширения Mammal. Это не как Mammal of a weirder sort расширение Mammal of a good ol' classical sort.

+0

thank u. очень четкое объяснение. – leohu

+0

исправление очевидной ошибки, что если это было полезно, следует отменить. BTW: как я сюда попал, ища самообучающиеся объекты ода? – Bart

Смежные вопросы