Reputation: 840
Let's assume we have following classess:
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> {/**/}
Now, i want to create generic class "VehicleWheelCarrier", which is inherited from Vehicle, and has 1 parameter, which is any type of wheel:
abstract class VehicleWheelCarrier<TWheel> : Vehicle where TWheel:VehicleWheel
Unfortunatelly, this doesn't compile, as VehicleWheel requires parameter.
How to solve that?
Upvotes: 3
Views: 82
Reputation: 23732
You would need a second generic parameter to define the needed type:
public abstract class VehicleWheelCarrier<TWheel, U> : Vehicle
where TWheel:VehicleWheel<U>
where U : Vehicle { }
EDIT: This will prevent you from making nonsensical constructs like:
class BusWheelCarrier : VehicleWheelCarrier<BusWheel, Truck>{ }
with the error:
There is no implicit reference conversion from
BusWheel
toVehicleWheel<Truck>
.
But this will work:
class BusWheelCarrier : VehicleWheelCarrier<BusWheel, Bus>{ }
Upvotes: 3
Reputation: 1943
You may add a non-generic base for wheel like this:
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
Upvotes: 3