创建代码以使用外部库中的两个类似类中的任何一个

时间:2012-11-10 18:33:30

标签: c# inheritance abstract-class

我正在开发一种算法,该算法将由两个不同的团队使用,每个团队都有自己的类型用于算法所处理的对象。我希望通过在两个类之间尽可能多地使用我的算法代码来减少重复。

为了使事情更具体,让我们假设我正在制作一个名为Drive()的算法,该算法需要同时适用于汽车和卡车。不幸的是,卡车和汽车都没有继承的Vehicle类,但卡车和汽车都可以访问Drive算法所需的所有方法和类成员。我似乎不太可能让这些外部团队就继承的课程达成一致。

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

我目前的想法是创建一个第三类Vehicle,它可以容纳Car或Truck,然后通过调用我的算法所需的类成员/方法。

3 个答案:

答案 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),将来会接受TruckCoach,那么您可以创建{ {1}}无需更改任何允许您遵循OCP的现有CoachAdapterCarAdapter代码(开放封闭原则 - 代码应该是开放的扩展名和已关闭以进行修改),您可以不能用TruckAdapter类实现,因为你必须修改它以支持教练。