我是面向对象编程的新手,我仍然无法组织我的程序。
我正在用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类,我想以某种方式显示它。
答案 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>
向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
类型。