c#类强制至少一个关系

时间:2012-07-11 16:49:40

标签: c# class .net-4.0

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

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

如何创建模仿此行为的类?我想出的如下:

    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以便将它与我的航空公司联系起来。此外,我正在寻找代码或其他任何可以改进的东西。

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

我认为,在这种情况下,在航空公司上使用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)
    {
    }
  }
}

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

答案 2 :(得分:1)

这很好。除了循环引用。您有包含Airline对象的Flight类,以及包含Flight对象列表的Airline类。让航空公司对象成为父母,在您的代码中,您只会在父母子女关系认为合适的情况下将航班添加到航空公司的航班列表中。 Flight课程不需要了解航空公司的课程。

答案 3 :(得分: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"));

答案 4 :(得分: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));

答案 5 :(得分:0)

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

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

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