2016-08-19 9 views
2

クラス自体のプロパティであるデリゲートによってインスタンスを操作したいと思います。デリゲートのパラメータは常にインスタンス自体でなければなりません(派生クラスでも!)。基本クラスのジェネリックアクションのパラメータとして派生クラス型を使用

以下のコードを参照してください。私はcar1をcar型にキャストしなければならないため、コードがコンパイルされていないことを知っています。キャストせずに解決策を探しています。

コード

static void Main(string[] args) 
{ 
    var car = new Car(); 
    car.VehicleManipulator = car1 => car1.SomeInt++; 
    car.ManipulateVehicle(); 

    Console.WriteLine("end"); 
    Console.ReadLine(); 
} 

internal class Vehicle 
{ 
    public Action<Vehicle> VehicleManipulator { get; set; } 

    public void ManipulateVehicle() 
    { 
     this.VehicleManipulator(this); 
    } 
} 

internal class Car : Vehicle 
{ 
    public int SomeInt { get; set; } 
} 

EDIT: 変更されたコード!

私の質問は、基本クラスのすべてでこれを処理する良いソリューションがありますが、動作では、キャストせずに派生クラスを使用したいと思います。

+0

どこに問題がありますか?それが問題であれば、すべてのクラスオーバーライドを継承した[virtual](http://stackoverflow.com/q/8309419/1997232)メソッドを使用することができます。 – Sinatr

+0

Car.VicleManipulatorのアクションはnullです。あなたはそれを割り当てずに仮想化し、コンパイラは派生クラス –

+0

@ A.Tの実装を探します。逆に、*プロパティは割り当てられますが、メソッドは*基本クラスの*プロパティを使用します。これはヌルではなく、継承に関するものです。 –

答えて

2

あなたはキャストを避けたい場合は、のような車両は、一般的な作り:

一つはそうだけの車、トラック、オートバイなど

、種類などせずに、単に車を作成することはできません、作業コードは次のようなものになることができます

class Vehicle<T> where T : Vehicle { 
    Action<T> ManipulateVehicle { get; set; } 
} 

class Car : Vehicle<Car> { 
    int SomeInt { get; set; } 
} 

ちょっと変わって見えますが、車のインスタンスを持っているとマニピュレータが車で動作し、トラックがあればトラックなどで動作します。車両はおそらく抽象的でなければならない。

4

あなたは近くです。この行のNullReferenceExceptionを取得する理由は、アクションがnullであるためです。car.ManipulateVehicle();です。

enter image description here

そして、あなたが見るように、基本クラスのVehicleManipulatorプロパティはnullです。

ここで、アクションを割り当てているときに失敗した行のすぐ上にある場合は、どのようにしてnullにすることができますか?だから問題は、あなたの派生クラスでは、新しいというプロパティがあり、その名前はVehicleManipulatorで、ベースのクラスを隠しています。したがって、car.VehicleManipulatorを割り当てると、基本クラスではなく派生クラスのプロパティを実際に割り当てています。

派生クラスから削除しても問題ありません。

私がまだ理解できない理由で、派生クラスのプロパティを保持したい場合は、割り当てを行うときに、次のように基本クラスに割り当てることを指定できます。

enter image description here

+0

@Snowcrack - これは何が起こったのかを明確にし、それを解決するのに役立ちましたか? –

0

だけ車クラスからのコード行を削除:

public Action<Car> VehicleManipulator { get; set; } 

ManipulateVehicleは、基本クラスのメソッドであり、呼び出されたときには、塩基(由来しない)クラスのVehicleManipulatorプロパティで中華鍋。

派生クラスにVehicleManipulatorプロパティを追加するには、基本財産を隠し、割り当てられている場合 - 基本プロパティは、それが故にNullReferenceException

私もそれがあるとしてVehicleの署名にキーワードabstractを追加することをお勧めしたいnullのデフォルト値のしています純粋な抽象化。

abstract internal class Vehicle 
{ 
    public virtual Action<Vehicle> VehicleManipulator { get; set; } 

    public void ManipulateVehicle() 
    { 
     this.VehicleManipulator(this); 
    } 
} 

internal class Car : Vehicle 
{ 
} 
関連する問題