1

私は車両を保存するアプリを構築しています。車両の種類 (車、トラック、バス) ごとに個々のフォームをロードするためのボタンが付いたメイン フォームがあり、それらはすべて車両クラスからメイン プロパティを継承しています。また、すべての車両をフリートに追加できるように、「フリート」クラスもあります。

最初の作業車を手に入れることができましたが、2番目の(トラック)車に苦労しています。ボタンをクリックするとトラックフォームがロードされ、txtボックスにデータを入力できますが、「閉じる」ボタンをクリックするとフォームでは何も起こりません!アプリを閉じると、「NotImplementedExecption was unhandled」というメッセージが表示されます

何かアイデアはありますか?何が欠けていますか?事前に乾杯....

public partial class FrmHireCo : Form
    /*
     * This is the main form for the car hire system.
     * It allows the adding to new cars to the system, and displaying them in the fleet list
     * 
     */
{
    private Fleet myFleet = new Fleet();
    //Fleet object used to store cars

    public FrmHireCo()
    {
        //Default constructor
        InitializeComponent();
    }


    private void updateFleetList()
    {   
        lstFleet.Items.Clear();
        foreach (Vehicle v in myFleet.fleet)
        {
            lstFleet.Items.Add(v);
        }
    }

    private void btnAddCar_Click(object sender, EventArgs e)
    {
        //Add a new car
        FrmCar carGui = new FrmCar(); //Form used to add new car
        carGui.ShowDialog();
        Car myCar = carGui.car;         //Get new car from form
        myFleet.addToFleet(myCar);      //Add to fleet list
        updateFleetList();              //Uodate fleet list
    }

    private void lstFleet_SelectedIndexChanged(object sender, EventArgs e)
    {
        /*
         * This method is used to control the list box
         * It is called when a row is selected by the user, it then displays frmCar
         * with the car details
         */ 
        if (lstFleet.SelectedIndex > -1)
        {
            int index = lstFleet.SelectedIndex;
            Car myCar = myFleet.fleet.ElementAt(index);
            FrmCar carGui = new FrmCar();
            carGui.car = myCar;
            carGui.Show();
        }
    }

    private void FrmHireCo_Load(object sender, EventArgs e)
    {

    }

    private void btnAddTruck_Click(object sender, EventArgs e)
    {
        FrmTruck truckGui = new FrmTruck(); //Form used to add new car
        truckGui.ShowDialog();
        Truck myTruck = truckGui.truck;         //Get new car from form
        myFleet.addToFleet(myTruck);      //Add to fleet list
        updateFleetList();              //Uodate fleet list
    }

}

} }

これは、トラック フォームなどをロードするためのボタンを備えたメイン フォームです。これがフリート クラスです。本当にばかげたものを見逃していると思います!

class Fleet
{
    /*
     * This class is used to hold a list of Car objects that make up the fleet:
     * The car objects may be added through the addToFleet() method.
     * The car objects may be deleted tgrough the deleteFromFleet() method 
     * Use the fleet property to access the list of car objects
     */ 

    private List<Vehicle> theFleet = new List<Vehicle>(); //The list of car objects being stored

    public List<Vehicle> fleet 
        /* The fleet property. Note that you can only read it
         * use the addToFleet and deleteFromFleet to update it
         */
    {
        get
        {
            return theFleet;
        }
    }

    public void deleteFromFleet(Vehicle aVehicle)
        //Delete car from fleet
    {
        theFleet.Remove(aVehicle);
    }

    public void addToFleet(Vehicle aVehicle)
        //Add car to fleet
    {
        theFleet.Add(aVehicle);
    }

    internal void addToFleet(Truck myTruck)
    {
        throw new NotImplementedException();
    }
}

}

これは、「NotImplementedException was unhandled.

 internal void addToFleet(Truck myTruck)
    {
        throw new NotImplementedException();
    }
}

}

4

4 に答える 4

1

ある時点で、Visual Studio から「'Fleet' で 'addToFleet' のメソッド スタブを生成する」ように求められたようですが、あなたは「はい」と答えました。Visual Studio がメソッドを生成すると、throw new NotImplementedException();戻ってメソッドを実装する必要があることを示すリマインダーとして内部に配置されます。したがって、通常は、例外をスローする行を削除して、メソッドに属するコードに置き換えます。

ただし、あなたの場合、その方法はまったく必要ないと思います。Truck は Vehicle を継承していると仮定します。その場合、Vehicle を受け取る addToFleet のオーバーロードは、Truck でも機能します。したがって、メソッド全体を削除できますinternal void addToFleet(Truck myTruck)

于 2010-12-02T20:56:30.967 に答える
1

次のようなコードを使用するのが最善です。

myFleet.fleet.Add(myTruck);

とにかくそれらの関数を呼び出すだけの独自のカスタム追加/削除関数を使用するよりも。それがあなたの意図であるなら、あなたはそれらを隠していません。

この問題が発生している理由については...オーバーロードの解決を調べて、同じアセンブリ内のすべてのものがアクセスできることを内部的に意味することを覚えておく必要があります。問題。

于 2010-12-02T20:52:03.863 に答える
1

フリートにトラックを追加するとき、コンパイラは渡された型に一致するメソッドを呼び出しているため、実際には呼び出されてinternal void addToFleet(Truck myTruck)いません。public void addToFleet(Vehicle aVehicle)

メソッドを捨てるinternal

于 2010-12-02T20:52:24.510 に答える
0
internal void addToFleet(Truck myTruck) 
{ 
    throw new NotImplementedException(); 
} 

どうやら、関数が実装されているコードの部分を正しく説明していないようです。「throw new NotImplementedException」を自分のコードに置き換えるだけです。

于 2010-12-02T20:49:30.740 に答える