C# 泛型继承

C# 泛型继承,c#,.net,oop,generics,inheritance,C#,.net,Oop,Generics,Inheritance,假设我们有以下类: abstract class Vehicle {/**/} class Truck : Vehicle {/**/} class Bus : Vehicle {/**/} //etc... abstract class VehicleWheel<TVehicle> where TVehicle : Vehicle {/**/} class TruckWheel : VehicleWheel<Truck> {/**/} class BusWheel

假设我们有以下类:

abstract class Vehicle {/**/}

class Truck : Vehicle {/**/}
class Bus : Vehicle {/**/}
//etc...

abstract class VehicleWheel<TVehicle> where TVehicle : Vehicle {/**/}

class TruckWheel : VehicleWheel<Truck> {/**/}
class BusWheel : VehicleWheel<Bus> {/**/}
抽象类车辆{/**/}
卡车类别:车辆{/**/}
等级总线:车辆{/**/}
//等等。。。
抽象类VehicleWheel,其中TVehicle:Vehicle{/**/}
货车轮类:车辆轮{/**/}
总线轮类:车辆轮{/**/}
现在,我想创建一个通用类“VehicleheelCarrier”,它继承自Vehicle,有一个参数,可以是任何类型的车轮:

abstract class VehicleWheelCarrier<TWheel> : Vehicle where TWheel:VehicleWheel
抽象类VehicleheelCarrier:Vehicle其中TWheel:Vehicleheel
不幸的是,这无法编译,因为VehicleWheel需要参数


如何解决此问题?

您需要第二个通用参数来定义所需类型:

public abstract class VehicleWheelCarrier<TWheel, U> : Vehicle 
                                                     where TWheel:VehicleWheel<U> 
                                                     where U : Vehicle { }

您可以为车轮添加非通用底座,如下所示:

abstract class Vehicle {/**/}

class Truck : Vehicle {/**/}
class Bus : Vehicle {/**/}
//etc...

abstract class VehicleWheelBase { internal VehicleWheelBase() { } /*Non-generic definitions of Wheel*/}
abstract class VehicleWheel<TVehicle> : VehicleWheelBase where TVehicle : Vehicle {/**/}

class TruckWheel : VehicleWheel<Truck> {/**/}
class BusWheel : VehicleWheel<Bus> {/**/}

abstract class VehicleWheelCarrier<TWheel> : Vehicle where TWheel : VehicleWheelBase
抽象类车辆{/**/}
卡车类别:车辆{/**/}
等级总线:车辆{/**/}
//等等。。。
抽象类VehicleHeelBase{internal VehicleHeelBase(){}/*车轮的非通用定义*/}
抽象类VehicleWheel:VehicleWheel数据库,其中TVehicle:Vehicle{/**/}
货车轮类:车辆轮{/**/}
总线轮类:车辆轮{/**/}
抽象类VehicleHeelCarrier:VehicleWheel:VehicleHeelBase

提供参数。因此,
VehicleHeelCarrier
不关心它是否承载卡车或公共汽车的车轮或任何其他类型的车轮。问题是,它关心什么?它需要做它应该做的任何轮子的什么特性?创建
Wheel
的抽象超类(没有任何泛型),或者更好的是,创建一个接口
IWheel
,让
vehicleweel
继承它,然后
vehicleweelcarrier
使用它。这是唯一的方法吗?如果我这样做的话,下面的构造:class busweelcharrier:vehicleheelcharrier{/**/}将是有效的,即使它没有意义。@JakubSzułakiewicz我不太理解你的例子。它是从
车辆HEELCARRER
继承的新类吗?你能给出一个完整的例子吗?如果你想为每种可能的
VehicleWheel
VehicleWheel
组合提供非常专业的
VehicleWheel
实例,那就太好了(而且是正确的)。但我理解OP希望能够在同一实例中携带“任何类型的轮子”。@JakubSzułakiewicz如果我理解正确,实际上这是无效的。看看我的编辑,你说得对。它解决了问题。但是,@Aly El-Haddad提供的解决方案更适合我的情况。谢谢你的帮助!伟大的这就是我要找的!非常感谢。
class BusWheelCarrier : VehicleWheelCarrier<BusWheel, Bus>{ }
abstract class Vehicle {/**/}

class Truck : Vehicle {/**/}
class Bus : Vehicle {/**/}
//etc...

abstract class VehicleWheelBase { internal VehicleWheelBase() { } /*Non-generic definitions of Wheel*/}
abstract class VehicleWheel<TVehicle> : VehicleWheelBase where TVehicle : Vehicle {/**/}

class TruckWheel : VehicleWheel<Truck> {/**/}
class BusWheel : VehicleWheel<Bus> {/**/}

abstract class VehicleWheelCarrier<TWheel> : Vehicle where TWheel : VehicleWheelBase