[英]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.