簡體   English   中英

一個類創建另一個類的實例。 這些實例需要使用原始類中的信息,如何組織?

[英]One class makes instances of another class. These instances need to use information in original class, how to organize?

我是面向對象編程的新手,我仍然無法組織我的程序。

我正在用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類,我想以某種方式展示它。

您可以在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);
    }
}

對我來說似乎很好,我只是隱藏了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()

您可以使用Action<T>來使用更多的Observer模式類型方法

向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類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM