Ik ben bezig met een groot project in Visual C# (framework 2.0) en zit nu met een probleem met generics. In versimpelde versie ziet het er als volgt uit:
Het is dus in de CarView niet mogelijk om de parameter vehicle, van type VehicleManager<Vehicle> toe te wijzen aan of te casten naar de carManager van type CarManager, ondanks het feit dat een Car wel overerft van Vehicle.
Als de parameter verandert wordt naar een VehicleManager<Car> werkt het uiteraard wel, aangezien de CarManager direkt overerft van die klasse. Echter, dan kan ik de Initialize functie niet laten overerven en dat wil ik nu juist wel, zodat de Initialize op een variable van type VehicleView aangeroepen kan worden, wat dan op runtime een CarView is, of een TruckView, enzovoort.
Is er nu een mooie manier om dit op te lossen?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| public class Vehicle { } public class Car : Vehicle { } public class VehicleManager<T> where T : Vehicle { List<T> vehicles; } public class CarManager : VehicleManager<Car> { } public abstract class VehicleView { public abstract void Initialize(VehicleManager<Vehicle> vehicleManager); } public class CarView : VehicleView { private CarManager carManager; public override void Initialize(VehicleManager<Vehicle> vehicleManager) { // Cannot implicitly convert type // 'vehicles.VehicleManager<vehicles.Vehicle>' // to 'vehicles.CarManager' carManager = vehicleManager; // Cannot convert type 'vehicles.VehicleManager<vehicles.Vehicle>' // to 'vehicles.CarManager' carManager = (CarManager)vehicleManager; } } |
Het is dus in de CarView niet mogelijk om de parameter vehicle, van type VehicleManager<Vehicle> toe te wijzen aan of te casten naar de carManager van type CarManager, ondanks het feit dat een Car wel overerft van Vehicle.
Als de parameter verandert wordt naar een VehicleManager<Car> werkt het uiteraard wel, aangezien de CarManager direkt overerft van die klasse. Echter, dan kan ik de Initialize functie niet laten overerven en dat wil ik nu juist wel, zodat de Initialize op een variable van type VehicleView aangeroepen kan worden, wat dan op runtime een CarView is, of een TruckView, enzovoort.
Is er nu een mooie manier om dit op te lossen?
[ Voor 5% gewijzigd door bigben04 op 15-06-2006 12:36 ]