Jakub Szułakiewicz
Jakub Szułakiewicz

Reputation: 840

Inheritance of generic type

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

Answers (2)

Mong Zhu
Mong Zhu

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 to VehicleWheel<Truck>.

But this will work:

class BusWheelCarrier : VehicleWheelCarrier<BusWheel, Bus>{ }

Upvotes: 3

Aly Elhaddad
Aly Elhaddad

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

Related Questions