0

フライトを管理する小さなアプリに取り組んでいます。フライトの詳細を作成するクラスと乗客を作成するクラスがあります。乗客をフライトにロードしたいのですが、どうすればよいですか? この2つのクラスから継承するより高いクラスを構築し、そのタイプのクラスのリストを作成する必要がありますか(私はそれが賢明だとは思いません)。それとも、フライト番号を持つ乗客クラスにチケット小道具を追加する必要がありますか私のコードです。

  public class Passenger
{
    public Passenger(string name, int passportNumber)
    {
        this.PassengerName = name;
        this.PassportNumber = passportNumber;
    }

    private string _passengerName;
    public string PassengerName
    {
        get { return _passengerName; }
        set { _passengerName = value; }
    }

    private int _passportNumber;
    public int PassportNumber
    {
        get { return _passportNumber; }
        set { _passportNumber = value; }
    }

 }

public class FlightDetails
{
    public FlightDetails(int flightNumber, string flightDestination, string planmodel)
    {
        this.FlightNumber = flightNumber;
        this.FlightDestination = flightDestination;
        this.PlanModel = planmodel;
    }

    private int _flightNumber;
    public int FlightNumber
    {
        get { return _flightNumber; }
        set { _flightNumber = value; }
    }

    private string _flightDestination;
    public string FlightDestination
    {
        get { return _flightDestination; }
        set { _flightDestination = value; }
    }

    private string _planeModel;
    public string PlanModel
    {
        get { return _planeModel; }
        set { _planeModel = value; }
    }
}
      static void Main(string[] args)
    {
        List<FlightDetails> flightList = new List<FlightDetails>();

        FlightDetails a = new FlightDetails(12,"france","jumbo");///create a flight

        flightList.Add(a);///  load up the flight

    }
4

5 に答える 5

2

まず、C# では多重継承が許可されていないため、他の両方のクラスから継承するクラスを作成することはできません。

次のような集計を使用できます。

public class FlightDetails
{
   // ...
}

public class Passenger
{
   // ...
}

public class Flight
{
    public FlightDetails { get; private set; }
    public List<Passenger> Passengers { get; private set; }

    public Flight(FlightDetails details)
    {
        FlightDetails = details;
        Passengers = new List<Passenger>();
    }

    public AddPassenger(Passenger p)
    {
        // check for ticket and so on..

        Passengers.Add(p);
    }
}

集計について詳しくは、http: //en.wikipedia.org/wiki/Object_composition#Aggregationをご覧ください。

この例では簡単にするために List を使用しましたが、実際にはこの配列へのアクセスを制限する必要があることに注意してください (そうしないと、Flight.AddPassenger(p) の代わりに Flight.Passengers.Add(p) のようなことができるため)。このリストへのパブリック インターフェイスとして ReadOnlyCollection を使用します。

于 2013-01-16T08:27:52.550 に答える
1

論理的には、FlightDetail と Passenger の関係は OneToMany です。1 つの FlightDetail に複数の Passenger を含めることができます。これは次のように記述できます。FlightDetail と Passenger には共通の属性や動作がないため、共通の継承階層を持つ必要があります。

 public class FlightDetails
 {
        private List<Passenger> passengerList;
        public void addPassenger(Passenger p){
            if(passengerList == null){
 passengerList = new ArrayList<Passenger>();

    }
    passengerList.add(p);
            }

    public List<Passenger> getPassengerList(){
    return passengerList;
    }
    //... your other detail
 }
于 2013-01-16T08:23:45.837 に答える
1

Passenger クラスに FlightDetails プロパティを追加する必要があります。これは、PassportNumber をインデックスとして List を作成するよりも簡単です。ただし、List を使用して FlightDetails を反復する方が、Passenger を介してアクセスするよりも簡単です。

于 2013-01-16T08:24:53.913 に答える
1

動作する可能性のあるサンプルコードを次に示します。フライトには 1 人以上の乗客がいて、タイプ Passenger のリストがあります。実際には、乗客は複数のフライトを予約できます。現実が必要な場合は、モデルを変更する必要がありますが、この状況では機能します。

public class Passenger
{
    public Passenger(string name, int passportNumber)
    {
        PassengerName = name;
        PassportNumber = passportNumber
    }

    public string PassengerName { get; set; }
    public int PassportNumber { get; set; }
}

public class FlightDetails
{
    public FlightDetails(int flightNumber, string flightDestination, string planmodel)
    {
        FlightNumber = flightNumber;
        FlightDestination = flightDestination;
        PlanModel = planmodel;
        Passengers = new List<Passengers>();
    }

    public int FlightNumber { get; set; }
    public string FlightDestination  { get; set; }
    public string PlanModel { get; set; }
    public List<Passenger> Passengers { get; private set; }

    public void AddPassenger(string name, int number)
    {
        int max = 2;
        int passengersNumber = Passengers.Count;

        if (passengersNumber < max)
        {
            Passengers.Add(new Passenger(name, number);
        }
    }
public static void Main(string[] args)
{
    var flightList = new List<FlightDetails>();
    var passengersList = new List<Passenger>();

    //Add passenger-objects to passengers-list

    var flightOne = new FlightDetails(12, "France", "Jumbo");
    flightOne.Passengers = passengersList;

    flightList.Add(a);
}

乗客を制限するためのより良い解決策は次のとおりです。

public class FlightDetails
{
    public FlightDetails(int flightNumber, string flightDestination, string planmodel)
        : this(flightNumber, flightDestination, planmodel, new List<Passenger>())
    {
    }

    public FlightDetails(int flightNumber, string flightDestination, string planmodel, List<Passenger> passengers)
    {
        FlightNumber = flightNumber;
        FlightDestination = flightDestination;
        PlanModel = planmodel;

        if(passengers.Count > 2)
            //throw exception or error
        else
            _passengers = passengers;
    }

    private List<Passenger> _passengers = new List<Passenger>();

    public int FlightNumber { get; set; }
    public string FlightDestination  { get; set; }
    public string PlanModel { get; set; }

    public IEnumerable<Passenger> Passengers { get { return _passengers; } }

    public void AddPassenger(string name, int number)
    {
        int max = 2;
        int passengersNumber = _passengers.Count;

        if (passengersNumber < max)
        {
            _passengers.Add(new Passenger(name, number);
        }
    }
}

注: このコードはコンパイルせずに記述されています。でもその考えは普通に正しい。:)

于 2013-01-16T08:30:40.903 に答える
0

実際には、関係にアクセスして保存する方法によって異なります。

パターンには別の目的がありますが、実際には親子関係の間を移動するための優れたソリューションを備えた複合パターンについて読むことをお勧めします。

于 2013-01-16T08:29:05.377 に答える