何が最良の方法を受け継ぐに配列するニーズを店舗のサブクラスは特定のデータはもらえますか?
-
09-06-2019 - |
質問
ようにしている設定を継承階層で、例えば次のようなもの:
abstract class Vehicle
{
public string Name;
public List<Axle> Axles;
}
class Motorcycle : Vehicle
{
}
class Car : Vehicle
{
}
abstract class Axle
{
public int Length;
public void Turn(int numTurns) { ... }
}
class MotorcycleAxle : Axle
{
public bool WheelAttached;
}
class CarAxle : Axle
{
public bool LeftWheelAttached;
public bool RightWheelAttached;
}
いさおだけ屋MotorcycleAxleオブジェクトは、二輪車のオブジェクトの軸配列CarAxleオブジェクトは、車のオブジェクトの軸配列になります。問題はる方法はありませんオーバーライドは、配列のサブクラスへの力の。理想的には、次のようなものが有効での二輪車のクラス:
class Motorcycle : Vehicle
{
public override List<MotorcycleAxle> Axles;
}
その種類に合わせ場をオーバー.どのように対応していこすものでした。まってたくさんの実行時の型チェックを鋳造ではどこの軸はアクセス?んの追加実行時の型チェックできるなどして、お忘れに特典の強いタイピングおよび多型.あの少なくとも一部実行時のチェックをこのシナリオからのWheelAttached、左RightWheelAttached特性に依存しない最小化します。
解決
使用によりジェネリック医薬品
abstract class Vehicle<T> where T : Axle
{
public string Name;
public List<T> Axles;
}
class Motorcycle : Vehicle<MotorcycleAxle>
{
}
class Car : Vehicle<CarAxle>
{
}
abstract class Axle
{
public int Length;
public void Turn(int numTurns) { ... }
}
class MotorcycleAxle : Axle
{
public bool WheelAttached;
}
class CarAxle : Axle
{
public bool LeftWheelAttached;
public bool RightWheelAttached;
}
他のヒント
2つのオプションの春に思い浮かびます。1はジェネリック医薬品:
abstract class Vehicle<TAxle> where TAxle : Axle {
public List<TAxle> Axles;
}
第二次利用シャドーイングで想定してい物件:
abstract class Vehicle {
public IList<Axle> Axles { get; set; }
}
class Motorcyle : Vehicle {
public new IList<MotorcycleAxle> Axles { get; set; }
}
class Car : Vehicle {
public new IList<CarAxle> Axles { get; set; }
}
void Main() {
Vehicle v = new Car();
// v.Axles is IList<Axle>
Car c = (Car) v;
// c.Axles is IList<CarAxle>
// ((Vehicle)c).Axles is IList<Axle>
問題はシャドーイングをしている汎用の一覧です。残念ながら、できない制約、リストだけが含まれまCarAxle.また、できなキャスト一覧<Axle> 入りリスト<CarAxle> もありチェーンの継承ります。いキャストオブジェクトを新しいリストがなくとLINQ).
なったと思いジェネリック医薬品です。
聞いてみることにした 類似の問題 とってより良い答えは、その問題点に関連C#'s支援のための共分散とcontravariance.この議論で、もう少し詳しい情報です。
所属していません StackOverflow