一个类创建另一个类的实例。这些实例需要使用原始类中的信息,如何组织?

时间:2014-03-14 11:44:35

标签: c#

我是面向对象编程的新手,我仍然无法组织我的程序。

我正在用c#模拟一个工厂。我有一个Simulation类的实例。初始化时,构造函数会创建几个Machine类的实例。

Simulation类有一个事件列表。 Machine类具有需要向此列表添加事件的方法。现在,我看到如何做到这一点的唯一方法是将模拟的引用传递给Machine构造函数。然而,这些对我来说似乎很混乱,我觉得必须有一个更好的组织方式。

public class Simulation
{
    public LinkedList<Event> event_list = new LinkedList<Event>();

    public Simulation()
    {
        Machine m1 = new Machine(this);
        Machine m2 = new Machine(this);
    }

    static void Main(string args[])
    {
        Simulation sim = new Simulation();
    }
}

public class Machine
{
    public Simulation sim;

    public Machine(Simulation sim)
    {
        this.sim = sim;
    }

    public void Schedule_Event()
    {
        sim.event_list.AddLast(new Event(etc etc));
    }
}

public class Event
{
}

有没有办法将事件添加到Simulation.event_list而无需传递this引用?从某种意义上说,每台机器都属于Simulation类,我想以某种方式显示它。

3 个答案:

答案 0 :(得分:2)

您可以在Machine中使用返回Event个对象的方法,然后Simulation可以将其添加到event_list

public class Simulation
{
    public LinkedList<Event> event_list = new LinkedList<Event>();

    public Simulation()
    {
        Machine m1 = new Machine();
        Machine m2 = new Machine();

        event_list.AddLast(m1.GetEvent());
        event_list.AddLast(m2.GetEvent());
    }

    static void Main(string args[])
    {
        Simulation sim = new Simulation();
    }
}

public class Machine
{
    public Machine() {}

    public Event GetEvent()
    {
        return new Event(etc etc);
    }
}

答案 1 :(得分:0)

对我来说似乎非常好,我只是隐藏了Simulation类中的event_list实现:

public class Simulation
{
    private LinkedList<Event> event_list = new LinkedList<Event>();

    public void addEven(Event x) {event_list.Add(x); }
}

在构造函数中传递它是好的,如果你真的想要,你可以在工厂中放置一个工厂方法:

public class Simulation
{
    public Machine CreateNewMachine() { return new Machine(this); }
}

只允许Machine m1 = Simulation.CreateNewMachine()

答案 2 :(得分:0)

您可以使用Action<T>

更多Observer-pattern类型的方法

向Machine添加公共操作:

public class Machine
{
    public Action<Event> EventAdded;

    private void Schedule_Event()
    {
        if(EventAdded != null)
            EventAdded(new Event());
    }
}

订阅创作后的行动:

public class Simulation
{
    public LinkedList<Event> event_list = new LinkedList<Event>();

    public Simulation()
    {

        Machine m1 = new Machine() { EventAdded = AddEvent };
    }

    static void Main(string[] args)
    {
        Simulation sim = new Simulation();
    }

    public void AddEvent(Event e)
    {
        event_list.AddLast(new Event(etc etc));
    }
}

然后,您在两个对象之间的唯一合约是Event类型。