Он говорит, что T должен быть типа Entity<T>
или производным от этого типа
Хотя это кажется парадоксальным, что это действует, а иногда может быть полезно тоже, хотя случаи встречаются редко и часто могут быть обработаны различными проще undertand пути.
Это часто refered в C жаргон ++ как Curiously recurring template pattern
В C# возможности несколько более ограничена, чем при использовании шаблона в C++ бетонных классов этой скороговорки, как правило, выглядит как этот
class MyClass<ItemType> : Entity<MyClass<ItemType>> {
//...
}
или просто
class MyClass : Entity<MyClass> {
//...
}
один пример, когда это может быть полезно при работе с атрибутами по типу.
Предположим, вы создаете список виджетов во время выполнения. Список включает все типы, которые происходят от Entity<T>
, и вы заполняете информацию на основе метаданных из атрибутов.В Entity<T>
вы можете справиться с этим раз и навсегда
void RegisterWidget(){
var attributes = typeof(T).GetAttributes();
//do what ever you need to
}
это бы, конечно, работать без ограничения, но она все еще может иметь смысл с функциональной точки зрения или показать намерены, и это может быть необходимо в других частях код
Мне очень жаль, но вы не путайте шаблоны C++ с C# дженериков? –
Не принцип ли тот же для C# ?; важно то, что тип ограничен таким образом. –
Согласен, этот ответ неправильный. В CRTP базовый класс также является общим, что здесь не так. И если вы говорите: «База» - это то же самое, что и «Entity », вы также ошибочны, потому что в C# вы не можете получить доступ к элементам производного класса в базе таким образом. –