3

这应该是一个简单的问题。

假设我有一家航空公司和一个航班。一家航空公司可以有多个航班。每个航班都应与一家航空公司相关联。

如何创建类来模仿这种行为?我想出如下:

    public class Airline
{
    private string Name;
    private string Description;
    private List<Flight> Flights;
    public Airline(string Name, string Description)
    {
        this.Name = Name;
        this.Description = Description;
    }
    public void AddFlight(Flight Flight)
    {
        if (!this.Flights.Contains(Flight))
        {
            this.Flights.Add(Flight);
        }
    }
    public void RemoveFlight(Flight Flight)
    {
        this.Flights.Remove(Flight);
    }
}

public class Flight
{
    private string No;
    private string Time;
    private Airline Airline;

    public Flight(Airline Airline, string No, string Time)
    {
        this.No = No;
        this.Time = Time;
        this.Airline = Airline;
    }
}

有没有更好的方法来完成这项任务?我不喜欢的是,当我创建航班时,我必须向其中添加航空公司,然后我必须调用 Airline.AddFlight 才能将其与我的航空公司相关联。另外,我正在查看代码是否还有其他问题或任何可以改进的地方。

4

6 回答 6

5

为什么不在施工时将航班添加到航空公司:

    public Flight(Airline Airline, string No, string Time)
    {
        this.No = No;
        this.Time = Time;
        this.Airline = Airline;
        Airline.AddFlight(this);
    }

?

于 2012-07-11T16:53:44.750 回答
1

我认为,在这种情况下,在 Airline 上使用 Add 方法,并将 Flight 类作为具有私有/受保护构造函数的子类对您有利:

public abstract class Airline
{
  protected List<Flight> _flights = new List<Flight>();

  public abstract Flight AddFlight(string no, string time)
  {
    this._flights.Add(new Flight(this, no, time));
  }

  public class Flight
  {
    protected Flight(Airline airline, string no, string time)
    {
    }
  }
}

在这种情况下,您要求航空公司创建航班并返回航班。

于 2012-07-11T16:56:34.600 回答
1

这可以。循环引用除外。您有包含 Airline 对象的 Flight 类,以及包含 Flight 对象列表的 Airline 类。让 Airline 对象成为父对象,在您的代码中,您仅在父子关系认为合适时才将航班添加到航空公司的航班列表中。Flight 类不需要 Airline 类的知识。

于 2012-07-11T16:58:40.577 回答
1

一方面,您真的不需要在飞行中提及航空公司。航班不需要知道它属于哪家航空公司。这种关联是与生俱来的。不要自己创建新航班,只需使用Airline.AddFlight().

因此,首先要做的是更改Flight构造函数以取出航空公司:

public Flight(string No, string Time)
{
    this.No = No;
    this.Time = Time;
}

所以,这里有一个例子。您想要创建 2 家航空公司,每家航空公司都有两个航班。这是执行此操作的代码:

Airline airline1 = new Airline("Airline1","First Airline");
airline1.AddFlight(new Flight("1","12:00"));
airline1.AddFlight(new Flight("2","12:00"));

Airline airline2 = new Airline("Airline2","Second Airline");
airline2.AddFlight(new Flight("1","12:00"));
airline2.AddFlight(new Flight("2","12:00"));
于 2012-07-11T17:02:43.460 回答
1

可以强制链接的另一种选择是将航班的工厂方法传递给航空公司的 AddFlight 方法,如下所示,基本上强制每个人以这种方式构建航班。

class Airline{
...
  Flight AddFlight(Func<Airline, Flight> flightFactory)
  {
    var flight = flightFactory(this);
    privateListOfFlights.Add(flight);
    return flight;
  }
}

用法(可以共享函数,而不仅仅是内联 lambda):

myAirline.AddFlight(airline=> new FancyFlight(airline, otherArgs));
于 2012-07-11T17:23:41.090 回答
0

在 Windows 窗体中,菜单使用如下模式:

class Airline
{
    // code as it was
    public Flight AddFlight(string No, string Time)
    {
        var flight = new Flight(this, No, Time);
        AddFlight(flight);
        return flight;
    }
}

这样你就可以保持灵活性并且不要两次陈述这种关系。

于 2012-07-11T16:59:26.620 回答