【问题标题】:Same method in two irrelevant classes - reduce repetition在两个不相关的类中使用相同的方法 - 减少重复
【发布时间】:2012-07-24 12:20:01
【问题描述】:

假设我有两节课

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. Super 类包含changeTyre(Car,Tyre) 方法似乎没有意义

这种情况是如何处理的?

【问题讨论】:

  • changeTyre(Car,Tyre) 作为类方法做了什么?如果实现相同,我希望它不必是类方法(不使用类属性/方法),或者两个类的重叠比您似乎建议的要多(例如,人名可能是为更换轮胎而记录:两个类都有一个 name 属性)在这种情况下,会有一个有意义的基类(例如 Person、CarLover 或其他东西)。
  • changeTyre(Car,Tyre) 是一个类方法,因为它是驾驶员和机械师的行为(我想我是正确的)。我仍然没有“相信”有一个基类包含 changeTyre(Car,Tyre) 方法:(
  • @D-Shan:这也是汽车和轮胎的行为:)
  • @user396672 :|但那是怎么发生的呢?我的意思是当汽车中的这种行为会发生时。例如:像car.ChangeTyre(Tyre) 这样的方法调用发生在哪里:(。它会出现在 Driver 和 Mechanic 类中,对吧?

标签: oop class methods


【解决方案1】:

为了扩展使用组合而不是继承 (Willie's answer),我认为您在关于使用 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);
    }
}

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

【讨论】:

  • 好的。无论如何,在作曲中我们不能不让它有一点重复,对吧?
  • @D-Shan - 没错。可以说 Driver 将更换轮胎的工作“委托”给了 Car。汽车是真正知道如何更换轮胎的东西。也许 AirportMechanic 有一个 Airplane 属性,他的 changeTyre 将工作委托给 Airplane - airplane.changeTypre(Tyre)
【解决方案2】:
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)
} 

这样做!

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

【讨论】:

  • +1,某种类型的组合(而不是继承)似乎是这里的答案。
【解决方案3】:

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

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

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

【讨论】:

  • 嗯,这似乎行得通。我没想到机械师是司机
  • @D-Shan 如果您将 Driver 分解为接口,您可能会发现 Driver 是由多个元素构成的。每个司机真的可以改变一个轮胎等吗?但实际情况是,机械师就是司机。
猜你喜欢
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多