Из вашего комментария:
Derived
будет наследоваться от Base<Derived>
.Чтобы создать Base<Derived>
, вам нужно иметь Derived
, поэтому вы должны создать Derived
, наследуя Base<Derived>
и т. Д. Как создается Base<Derived>
до Derived
?
Ваше недоразумение начинается отсюда:
Чтобы создать Base<Derived>
, вам нужно иметь Derived
Это не так.Вы можете подумать, что для создания T<U>
вам сначала понадобится экземпляр U
.
Возьмите List<string>
в качестве примера.Я могу создать List<int>
, не используя экземпляры string
:
var list = new List<string>();
list
не содержит string
s.Это просто пустой список.То же самое применимо и здесь.
Чтобы создать Base<Derived>
, вам нужен Internal<Derived>
, который вы получите, выполнив new Internal<Derived>()
.Internal<Derived>
также не требует, чтобы экземпляр Derived
создавался по той же логике.
В действительности здесь происходит попытка создать экземпляр Derived
.Вы вызываете его конструктор, который вызывает конструктор Base<Derived>
с экземпляром Internal<Derived>
.
Как создается Base<Derived>
до Derived
?
Если вы подумаете об этом, имеет смысл создать базовые классы перед производными классами.Чтобы создать Cat
, вы сначала создаете Animal
, а затем добавляете в него все * Cat
-специфические функции.