I’ve been away from inheritance for a while and need a little helping hand.
I have an abstract base class Chief. There are two inheriting classes Ship and Vehicle, which share several properties via Chief.
I have a method which uses those common properties:
public static void AssignRandomProperties(PSetList routeSettings, List<Chief> theChiefs)
but when I try to pass a
List<Ship>
or a
List<Vehicle>
I’m told that they can’t be converted. Here’s a sample method call:
ChiefRouteRandomizer.AssignRandomProperties(s.Route, theVehicles);
I was assuming of course that the List<Vehicle> would be treated as a List<Chief> when passed as the argument to AssignRandomProperties, but apparently not. Does the list need converting to List<Chief> first? If so, how?
First some explanation. You cannot convert
List<Vehicle>toList<Chief>because then the Add method would have the signaturevoid List<Chief>.Add(Chief item)and you would be able to store instances of theChiefclass in a list that was declared to only holdVehicles. This would break the type system; therefore it is not allowed.The easiest way to get around this is to pass in
theVehicles.ToList<Chief>(). However, this will create a new list. This has two implications: (1) You would be wasting memory by duplicating the list, and (2) if the method is going to mutate the list itself (add/remove items or replace members with other members) you will not see those changes on thetheVehicleslist. (If the objects the references in the list point to are the only things being modified, this is not a problem.)If you have control over the AssignRandomProperties method, consider using this signature instead: