实例化彼此引用的对象

时间:2019-01-24 10:46:02

标签: c#

我有三个相互引用的类。在执行某些方法之前,他们需要从其他类中获取一些数据。有一个大师班,所有三个班级。因此,为便于使用,您创建了master实例,并使用master访问这些类。

internal class Master
{
    public Master()
    {
        a = new A(b, c);
        b = new B(c);
        c = new C(a, b);
    }

    public A a;
    public B b;
    public C c;
}

enter image description here

您可能已经注意到,此代码将不起作用,因为a尝试使用bc,但稍后会实例化它们。

我创建了一个小片段,您可以复制粘贴并尝试一下。

internal class A
{
    public A(B b, C c)
    {
        this.b = b;
        this.c = c;
    }

    private B b;
    private C c;

    public void Foo()
    {
        b.GetSomeData(); // and use it
    }

    public void Bar()
    {
        c.GetSomeData(); // and use it
    }

    public object GetSomeData()
    {
        return null;
    }
}

// #####################################################################################

internal class B
{
    public B(C c)
    {
        this.c = c;
    }

    private C c;

    public void DoSomething()
    {
        c.GetSomeData(); // and use it
    }

    public object GetSomeData()
    {
        return null;
    }
}

// #####################################################################################

internal class C
{
    public C(A a, B b)
    {
        this.a = a;
        this.b = b;
    }

    A a;
    B b;

    public void DoSomething()
    {
        a.GetSomeData(); // and use it
        b.GetSomeData(); // and use it
    }

    public object GetSomeData()
    {
        return null;
    }
}

// #####################################################################################

internal class Master
{
    public Master()
    {
        a = new A(b, c);
        b = new B(c);
        c = new C(a, b);
    }

    public A a;
    public B b;
    public C c;
}

// #####################################################################################

internal class Program
{
    private static void Main(string[] args)
    {
        Master m = new Master();

        // random usage of m

        m.a.Foo();
        m.b.DoSomething();
        m.a.Bar();
        m.c.DoSomething();
        m.a.Foo();
    }
}

解决此问题的一种可能方法是创建一个类似构造函数的Init方法,但我以后可以调用它。

代替写作

public A(B b, C c)
{
    this.b = b;
    this.c = c;
}

我去

public void Init(B b, C c)
{
    this.b = b;
    this.c = c;
}

对于大师班

internal class Master
{
    public Master()
    {
        a = new A();
        b = new B();
        c = new C();

        a.Init(b, c);
        b.Init(c);
        c.Init(a, b);
    }

    public A a;
    public B b;
    public C c;
}

我可以使用“更好”的方式吗?

0 个答案:

没有答案