假设我们有这个界面:
interface IVehicle { ... }
一些实现它的类:
class Car : IVehicle { ... }
class Boat : IVehicle { ... }
class Plane : IVehicle { ... }
在我的用户界面中,我有一个FlowLayoutPanel
,可以访问某种带有多个IEnumerable<IVehicle>
对象的IVehicle
。
现在我想为每辆车创建一个UserControl
并将其添加到FlowLayoutPanel
。控制装置有点类似,但由于有不同类型的车辆,一些控制装置可能需要略微不同或以不同的方式工作,以便用户可以轻松地使用他的车辆。如何在没有太多混乱的情况下最好地解决这个问题?
答案 0 :(得分:2)
如何使用某种工厂方法:
UserControl CreateControl(IVehicle vehicle)
{
if (vehicle is Car)
{
return new CarControl();
}
else if (vehicle is Boat)
{
return new BoatControl();
}
...
}
答案 1 :(得分:2)
在界面IVehicle中,您可以添加一个方法来获取用户控件。
public interface IVehicle
{
UserControl GetVehicleControl();
}
如果您需要为每辆车控制,您可以使用以下代码:
public class Car : IVehicle
{
public UserControl GetVehicleControl()
{
return new CarControl();
}
}
否则,如果每种车型只需要一个控件:
public class Car : IVehicle
{
private static CarControl m_control;
public UserControl GetVehicleControl()
{
if(m_control == null)
m_control = new CarControl();
return m_control;
}
}
答案 2 :(得分:1)
我不确定您的目标究竟是什么,但是当您以通常的方式扩展用户控件时,您可以使用泛型:
public class VehicleControl<TVehicle>: UserControl
where TVehicle:IVehicle
{
//do something specific with IVehicle
}
public class CarControl : VehicleControl<Car>
{
//add stuff specific for the Car
}
答案 3 :(得分:0)
如果您知道在编写代码时的映射方式,可以使用映射设置Dictionary
:
private Dictionary<Type, Type> _vehicleToControlTypeMappings = new Dictionary<Type, Type>();
启动时加载映射:
_vehicleToControlTypeMappings.Add(typeof(Car), typeof(CarControl));
_vehicleToControlTypeMappings.Add(typeof(Plane), typeof(PlaneControl));
...并提供一种基于车辆获取新控件的方法:
private Control GetVehicleControl(IVehicle vehicle)
{
Control result = (Control)Activator.CreateInstance(
_vehicleToControlTypeMappings[(vehicle as object).GetType()]
);
// perform additional initialization of the control
return result;
}
然后,您只需将实现IVehicle
的类型的对象传递给方法:
IVehicle vehicle = new Car();
Control newctl = GetVehicleControl(vehicle);