1

我正在研究一种算法,该算法将被两个不同的团队使用,每个团队都有自己的算法工作对象的类类型。我想通过在两个类之间尽可能多地共享我的算法代码来减少重复。

为了使事情更具体,假设我正在制作一个名为 Drive() 的算法,该算法需要在 Cars 和 Trucks 上工作。不幸的是,没有 Truck 和 Car 都继承自 Vehicle 类,但 Trucks 和 Cars 都提供了对 Drive 算法所需的所有方法和类成员的访问。我似乎不太可能让这些外部团队就可以继承的类达成一致。

处理这种情况的最佳方法是什么?

我目前的想法是创建一个第三类车辆,它可以容纳一辆汽车或一辆卡车,然后将调用传递给我的算法所需的类成员/方法。

4

3 回答 3

3

这是一个接口的完美用例,而不是继承。您可以让两个团队同意使用定义您需要的方法的接口。你有 IVehicle 接口,它定义了驱动方法所需的方法。然后,您将方法设置为接受 IVehicle 而不是具体类型。

于 2012-11-10T18:46:11.863 回答
1

听起来是使用 C# 动态类型的理想场所。

让 Drive 获取一个动态参数,然后传递您的 Cars 和 Trucks

于 2012-11-10T18:38:02.313 回答
0

如果 2 个类在同一个程序集中,您可以要求 2 个独立的团队就两个类使用的通用接口达成一致,然后您可以使您的代码依赖于该接口。如果这些类在不同的程序集中,但都引用另一个公共程序集,则接口可以驻留在该程序集中。

另一种选择是使用适配器模式,这将是更好的使用方法,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 和 Truck可能具有稍微不同的属性、方法名称或参数等,但是您将其封装在适配器中,因此您的代码仅针对IVehicle. 这也比创建一个Vehicle接受 a的单个更好,Car或者Truck如果需要第 3 类(比如Coach),那么您可以创建一个CoachAdapter,而无需更改任何现有的CarAdapterTruckAdapter允许您遵循 OCP(开放封闭原则 -代码应该对扩展开放,对修改关闭),这是您无法通过Vehicle类实现的,因为您必须修改它以支持教练。

于 2012-11-10T19:08:51.173 回答