3

これは簡単な質問です。

航空会社とフライトがあるとしましょう。1 つの航空会社が複数のフライトを持つことができます。各フライトは 1 つの航空会社に関連付ける必要があります。

この動作を模倣するクラスを作成するにはどうすればよいですか? 私が思いついたのは次のとおりです。

    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

I think, in this case, it would be to your advantage to have the the Add method on the Airline, and the Flight class as a subclass with a private/protected constructor:

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

In this case, you ask the Airline to create the flight and return the Flight.

于 2012-07-11T16:56:34.600 に答える
1

これで問題ありません。循環参照を除いて。Airline オブジェクトを含む Flight クラスと、フライト オブジェクトのリストを含む Airline クラスがあります。航空会社オブジェクトを親にします。コードでは、親子関係が適切であると判断した場合にのみ、航空会社のフライト リストにフライトを追加します。Flight クラスには、Airline クラスの知識は必要ありません。

于 2012-07-11T16:58:40.577 に答える
1

リンクを強制するもう 1 つのオプションは、次のように航空会社の AddFlight メソッドにフライトのファクトリ メソッドを渡し、基本的にすべての人にこの方法でフライトを作成するように強制することです。

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

使用法(インラインラムダだけでなく、関数を共有できます):

myAirline.AddFlight(airline=> new FancyFlight(airline, otherArgs));
于 2012-07-11T17:23:41.090 に答える
1

一つには、飛行中の航空会社への言及は本当に必要ありません。フライトは、所属している航空会社を知る必要はありません。その関連付けは固有のものです。単独で新しいフライトを作成しないでください。単に を使用して作成してAirline.AddFlight()ください。

したがって、最初に行うことは、Flightairline を取り出すようにコンストラクターを変更することです。

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

では、例を示します。それぞれ 2 つのフライトを持つ 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 に答える
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;
    }
}

そうすれば、柔軟性を維持し、関係を 2 回述べることはありません。

于 2012-07-11T16:59:26.620 に答える