2012-07-11 26 views
3

这应该是一个简单的问题。c#类强制至少有一个关系

比方说,我有一个航空公司和一个航班。 一家航空公司可以有多个航班。 每个航班应该绑定到一家航空公司。

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

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才能将其与我的航空公司联系起来。此外,我正在查看是否有任何代码或任何可以改进的错误。

+1

是这个homeowkr – DarthVader 2012-07-11 16:53:05

+0

@DarthVader,不,不是这样的。 – user194076 2012-07-11 16:53:46

+0

好吧,一旦你分配航空公司,在那里你可以添加该航班到航班的航空公司列表。这很简单,很好。为什么你想让它复杂化。 – DarthVader 2012-07-11 16:54:09

回答

1

我认为,在这种情况下,这将是你的优势,对航空公司的Add方法,以及飞行类与私人/受保护的构造一个子类:

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) 
    { 
    } 
    } 
} 

在这如果您要求航空公司创建航班并返回航班。

+0

+1。重新阅读你的答案后,它非常接近我的(在你的情况下内联工厂)。 – 2012-07-11 17:25:04

+0

谢谢。按预期工作! – user194076 2012-07-19 21:46:41

5

你为什么不飞行时施工增加了航空公司:

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

+1

是的,这很好。不要试图让它变得复杂。生活已经够复杂了。 – DarthVader 2012-07-11 16:55:00

1

这很好。除了循环参考。您的Flight类包含Airline对象,Airline类包含Flight对象列表。让航空公司对象成为家长,在您的代码中,只有当父母的子女关系认为合适时才会将航班添加到航空公司的航班列表中。飞行班不需要航空班的知识。

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; 
    } 
} 

这样,你保持弹性,不注明的关系两次。

1

首先,你真的不需要提及航空公司内的航空公司。航班不需要知道它是哪个航空公司的一部分。这种关联是固有的。不要自行创建新的航班,只需使用Airline.AddFlight()创建它们。

因此,首先要做的是改变Flight构造拿出航空公司:

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

所以,这里是一个例子。你想创建2个航空公司,每个航班有两个航班。继承人的代码,这样做:

可强制进行链接是通过工厂方法的航班航空公司的像下面AddFlight方法,基本上强迫大家构建航班这样
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")); 
+0

@AlexeiLevenkov呃 - 我复制并粘贴了他的代码,并删除了航空公司的参数,但忘记取出它的初始化。现在它是固定的。 – 2012-07-11 17:28:43

+0

+1。听起来像是一个好主意,一般来说没有Flight的参考(如果它适用于你的情况)。 – 2012-07-11 18:46:56

1

还有一个选项。

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

用途(功能可以共享,而不仅仅是在线拉姆达):

myAirline.AddFlight(airline=> new FancyFlight(airline, otherArgs)); 
相关问题