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

本文关键字:实例 原始 信息 何组织 一个 创建 另一个 | 更新日期: 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类型。