我正在开发一种算法,该算法将由两个不同的团队使用,每个团队都有自己的类型用于算法所处理的对象。我希望通过在两个类之间尽可能多地使用我的算法代码来减少重复。
为了使事情更具体,让我们假设我正在制作一个名为Drive()的算法,该算法需要同时适用于汽车和卡车。不幸的是,卡车和汽车都没有继承的Vehicle类,但卡车和汽车都可以访问Drive算法所需的所有方法和类成员。我似乎不太可能让这些外部团队就继承的课程达成一致。
这种情况的最佳方法是什么?
我目前的想法是创建一个第三类Vehicle,它可以容纳Car或Truck,然后通过调用我的算法所需的类成员/方法。
答案 0 :(得分:3)
这不是继承,而是接口的完美用例。您可以让两个团队同意使用定义所需方法的界面。您有IVehicle接口,它定义了驱动方法所需的方法。然后设置方法以接受IVehicle而不是具体类型。
答案 1 :(得分:1)
听起来像是使用C#动态类型的完美场所。
让Drive获取一个动态参数,然后沿着
传递你的汽车和卡车答案 2 :(得分:0)
如果两个类在同一个程序集中,您可以要求两个独立的团队就两个类使用的公共接口达成一致,然后可以使您的代码依赖于该接口。如果类在不同的程序集中但都引用另一个公共程序集,则接口可以驻留在该程序集中。
另一种选择是使用适配器模式,这将是使用dynamic
的更好方法,或者如果团队不同意接口本身。要做到这一点,你将创建公共接口以及实现它的类,它可以将调用转发到定制的实现。
public interface IVehicle
{
void Turn(); // specify all the methods and properties you need here.
}
public class CarAdapter : IVehicle
{
private Car car;
public CarAdapter(Car car)
{
this.car = car;
}
public void Turn()
{
this.car.Turn();
}
}
public class TruckAdapter : IVehicle
{
private Truck truck;
public TruckAdapter(Truck truck)
{
this.truck = truck;
}
public void Turn()
{
this.truck.Turn();
}
}
您的代码只需要IVehicle
public void Drive(IVehicle vehicle) { ... }
可以像这样调用:
Drive(new CarAdapter(car));
//or
Drive(new TruckAdapter(truck));
这种方法的一个优点是Car and Truck 可能具有稍微不同的属性,方法名称或参数等,但是您将其封装在适配器中,因此您的代码只针对IVehicle
进行编程。这也比创建单Vehicle
更好,如果需要第3类(例如Car
),将来会接受Truck
或Coach
,那么您可以创建{ {1}}无需更改任何允许您遵循OCP的现有CoachAdapter
或CarAdapter
代码(开放封闭原则 - 代码应该是开放的扩展名和已关闭以进行修改),您可以不能用TruckAdapter
类实现,因为你必须修改它以支持教练。