Код ниже пахнет? Я рефакторинг некоторого кода и обнаружил эту циклическую связь, где foo нужен класс, которому нужен интерфейс, который реализует сам foo.
В реальном коде foo — это пользовательский элемент управления Silverlight, а ifoo имеет методы для выполнения действий типа пользовательского интерфейса, таких как вызов диалогового окна (например, ShowMessage
). Класс needsAnIfoo
— это (своего рода) контроллер, который использует интерфейс ifoo всякий раз, когда ему нужно что-то сделать с пользовательским интерфейсом. У меня есть разные «тематические» пользовательские интерфейсы, которые реализуют iFoo и имеют один и тот же шаблонный код в своем конструкторе. needsAnIfoo
имеет различные свойства, которые привязаны к данным пользовательского интерфейса (так что это тоже своего рода модель).
Он компилируется и работает нормально, но мне интересно, есть ли лучший способ.
Итак, пахнет?
interface ifoo
{
void bar();
}
class foo : ifoo
{
readonly needsAnIfoo _needsAnIfoo;
internal foo()
{
_needsAnIfoo = new needsAnIfoo(this);
}
#region ifoo Members
public void bar()
{
throw new NotImplementedException();
}
#endregion
}
class needsAnIfoo
{
readonly ifoo _myfoo;
public needsAnIfoo(ifoo foo)
{
_myfoo = foo;
}
}
static void Main(string[] args)
{
foo foo = new foo();
}
Возможно, мне следует обновить needsAnIfoo
без передачи iFoo в конструкторе, а затем передать ему iFoo
в методе Initialize
. Но это выглядит очень странно:
foo foo = new foo();
needsAnIfoo needsAnIfoo = new needsAnIfoo(foo);
foo.Initialise(needsAnIfoo);