我正在考虑使用访问者模式。
public class Car : Vehicle
{
public void Accept( IVehicleFormatter v )
{
v.Visit (this);
}
}
public class Truck : Vehicle
{
public void Accept( IVehicleFormatter v )
{
v.Visit (this);
}
}
public interface IVehicleFormatter
{
public void Visit( Car c );
public void Visit( Truck t );
}
public class VehicleXmlFormatter : IVehicleFormatter
{
}
public class VehicleSoapFormatter : IVehicleFormatter
{
}
有了这个,你避免了一个额外的继承树,并保持格式化逻辑与你的车辆类分开。当你创建一个新的车辆时,你必须向Formatter接口添加另一个方法(并在formatter接口的所有实现中实现这个新方法)。但是,我认为这是更好的,然后创建一个新的Vehicle类,并为每个IVehicleFormatter你有,创建一个新的类,可以处理这种新的车辆。