一个类创建另一个类的实例.这些实例需要使用原始类中的信息,如何组织
本文关键字:实例 原始 信息 何组织 一个 创建 另一个 | 更新日期: 2023-09-27 17:50:20
我对面向对象编程相当陌生,我仍然很难组织我的程序。
我正在用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
引用?从某种意义上说,每台机器都"属于"仿真类,我想以某种方式显示这一点。
您可以在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);
}
}
对我来说似乎很好,我只是将event_list实现隐藏在Simulation类中:
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>
为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
类型。