2

假设我有两节课

class Driver{
    //attributes of driver ,ex: driving licence number
    // methods related to driving ,ex: drive(Car) , stop(Car)
    changeTyre(Car,Tyre);   // sometimes the driver can change the tyres right?
}
class Mechanic{
    // Hard mechanical stuff , ex: repairEngine(Car)
    changeTyre(Car,Tyre);  // Simple.hence sometimes the driver also does
}

现在这两种changeTyre()方法的实现将是相同的。

现在我有两个问题,

  1. 存在重复(重复)代码
  2. changeTyre(Car,Tyre)拥有一个包含该方法的 Super 类似乎没有意义

这类情况如何处理?

4

3 回答 3

3

为了扩展使用组合而不是继承(威利的回答),我认为您在关于使用 ChangeTyre 之类的评论中走在了正确的轨道上car.ChangeTyre(Tyre)

每个机械师或司机都将与一辆车相关联,因此他们可以拥有 Car 属性 -

class Driver{

    Car driverCar;

    //constructor
    Driver(Car car)
    {
        driverCar = car;
    }

    //attributes of driver ,ex: driving licence number
    // methods related to driving ,ex: drive(Car) , stop(Car)
    changeTyre(Tyre) 
    {
        driverCar.changeTyre(Tyre);
    }
}

changeTyreDriver 和 Mechanic 的方法可能相同,但更换轮胎的实际逻辑将集中在一个地方。我认为继承不起作用,因为机制不是驱动程序,并且继承支持“is-a”关系。强制到超类(比如 Person)可能没有意义changeTyre,因为不是每个从 Person 继承的类都需要有一个changeTyre方法。有关组合而不是继承的更多信息,请参阅此问题

于 2012-07-24T13:24:59.643 回答
1
class Driver
{
    //attributes of driver ,ex: driving licence number
    // methods related to driving ,ex: drive(Car) , stop(Car)
    public TyreFunction TyreFunctions { get; set; }
}

class Mechanic {
    // Hard mechanical stuff , ex: repairEngine(Car)
    // Simple.hence sometimes the driver also does
    public TyreFunction TyreFunction { get; set; }
}

class TyreFunction
{
    change(Car,Tyre)
} 

做这个 !

然后你在一个类中没有重复的代码和控制。您还可以创建所有函数列表以将特定函数添加到类中。

于 2012-07-24T12:59:29.027 回答
0

我建议 Mechanic 实际上应该从 Driver 继承,因为我假设在您的上下文中,驾驶员可以做的任何事情,机械师都可以做(即驾驶汽车进行测试)。

changeTyre 方法应该是虚拟的,以便它可以被 Mechanic 覆盖,因为实现可能会有所不同(不同的工具等)。

我还建议将一些元素分离到接口中(驾驶方法、汽车保养方法等)。

于 2012-07-24T12:59:46.240 回答