( Я пометил это и как C#, и как Java, поскольку это один и тот же вопрос в обоих языках. )
Скажем, у меня есть эти классы
interface IKernel
{
// Useful members, e.g. AvailableMemory, TotalMemory, etc.
}
class Kernel : IKernel
{
private /*readonly*/ FileManager fileManager; // Every kernel has 1 file manager
public Kernel() { this.fileManager = new FileManager(this); /* etc. */ }
// implements the interface; members are overridable
}
class FileManager
{
private /*readonly*/ IKernel kernel; // Every file manager belongs to 1 kernel
public FileManager(IKernel kernel) { this.kernel = kernel; /* etc. */ }
}
Проблема с этим дизайном что как только FileManager
попытается сделать что-нибудьвнутри своего конструктора с ядром
(что может быть обоснованно необходимо), он будет вызывать виртуальный метод для потенциальный экземпляр подкласса, конструктор которого еще не вызван.
Эта проблема не возникает в языках, где вы можете определить настоящие конструкторы(а не инициализаторы, такие как C#/Java), поскольку в этом случае подклассы даже не существуютдо вызываются их конструкторы... но здесь возникает эта проблема.
Итак, каков наилучший/правильный дизайн/практика, чтобы этого не произошло?
Я не обязательно говорю, что мне нужныциклические ссылки, но факт в том, что Ядро
и FileManager
зависят друг от друга . Если у вас есть предложение, как решить эту проблему безиспользования циклических ссылок, это тоже здорово!