Как спроектировать класс, чтобы круговые зависимости не вызывали производные члены перед созданием?

( Я пометил это и как 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зависят друг от друга . Если у вас есть предложение, как решить эту проблему безиспользования циклических ссылок, это тоже здорово!

7
задан Mehrdad 18 May 2012 в 20:44
поделиться