Я думаю, что вы должны спросить наоборот: почему это не может быть возможно? Factory
- это просто тип, подобный любому типу, который разрешается компилятором.
Поскольку большинство ответов здесь указывают на то, что это работает только потому, что Factory
является статическим полем, я добавил следующий пример. Обратите внимание, что это очень примитивный пример связанного списка (вы, вероятно, не реализовали бы его таким образом по разным причинам, но лучшего примера я пока не нашел). В этом примере ChainedListItem
- это контейнер для элемента односвязного списка, который содержит поле того же типа для указания следующего элемента в списке. В списке есть (пустой) элемент заголовка, а последний элемент отмечен пустым полем _nextItem
:
public class ChainedListItem<T>
{
private ChainedListItem<T> _nextItem;
T _content;
public ChainedListItem<T> NextItem
{
get { return _nextItem; }
set { _nextItem = value; }
}
public T Content
{
get { return _content; }
set { _content = value; }
}
public ChainedListItem<T> Add(T content)
{
_nextItem = new ChainedListItem<T>();
_nextItem.Content = content;
return _nextItem;
}
public void Dump()
{
ChainedListItem<T> current = this;
while ((current = current.NextItem) != null)
{
Console.WriteLine(current._content);
}
}
}
class Program
{
static void Main(string[] args)
{
ChainedListItem<int> chainedList = new ChainedListItem<int>();
chainedList.Add(1).Add(2).Add(3);
chainedList.Dump();
}
}
«Кроличья нора» заходит так глубоко, как ваше пространство стека позволяет вам сделать еще один вызов конструктора типа. Если вы попытаетесь пойти еще глубже, вы получите исключение stackoverflow, как и в случае любой другой рекурсии.
Кстати, код, который вы написали в своем ответе, показывает очень простую реализацию Singleton , которая фактически основана на наличии (частного) статического члена того же типа, что и окружающий тип ,
И, наконец, что не менее важно, такие конструкции также прекрасно работают в C ++.