2012-07-24 88 views
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)方法的超级类

如何这些情况处理?

+1

'changeTyre(Car,Tyre)'做的是类方法吗?如果实现是相同的,我希望它不一定是一个类方法(不使用类属性/方法),或者两个类的重叠程度都超过了你的建议(例如,这个人的名字可能是记录更改轮胎:两个类都有一个名称属性),在这种情况下会有一个有意义的基类(例如Person或CarLover或其他)。 – catchmeifyoutry 2012-07-24 12:27:43

+0

changeTyre(Car,Tyre)是一个类方法,因为它既是Driver和Mechanic的行为(我想我是正确的)。我仍然没有“确信”拥有包含changeTyre(Car,Tyre )方法:( – Dinushan 2012-07-24 12:31:54

+0

@ D-Shan:这也是汽车和轮胎的行为:) – user396672 2012-07-24 12:50:51

回答

3

为了扩大继承使用构图(Willie's answer),我认为你在使用ChangeTyre(如car.ChangeTyre(Tyre))的评论中处于正确的轨道。

每个技工或驱动程序将关联到一辆车,这样他们就可以拥有一辆汽车性能 -

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); 
    } 
} 

他们changeTyre司机和机械师的方法可能是相同的,但实际的逻辑换胎将住在一个地方。我不认为继承是有效的,因为机制不是驱动因素,继承支持“是”关系。将changeTyre强制为超类(称为Person)可能没有意义,因为不是每个从Person继承的类都需要有changeTyre方法。有关继承构成的更多信息,请参见this question

+0

ok.anyhow在作品中,我们无法帮助它有一点点复制权吗? – Dinushan 2012-07-25 05:20:44

+0

@ D-Shan - 没错。您可以说驾驶员将更换轮胎的工作委托给汽车。这辆车是真正知道如何换胎的。也许一个AirportMechanic有一个飞机属性,他的'changeTyre'将这项工作委托给飞机 - 'airplane.changeTypre(Tire)' – rosscj2533 2012-07-25 15:15:47

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) 
} 

这样做!

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

+0

+1,某种类型的组合(而不是继承)似乎是这里的答案。 – rosscj2533 2012-07-24 13:17:37

0

我建议Mechanic应该从Driver继承,因为我假设在你的上下文中,任何一个驱动程序都可以做一个机械师能够做的事情(即驾驶汽车进行测试)。

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

我还建议,一些元素应该分成接口(驾驶方法,汽车维修方法等)。

+0

好吧,这似乎工作。我还没有想到,机械师是一个驱动程序 – Dinushan 2012-07-24 13:08:06

+1

@ D-Shan有可能,如果你把Driver分成接口,你会发现Driver是由几个元素构成的。每个驾驶员真的能改变一个人吗?但是,情况是机械师是一名司机。 – 2012-07-24 13:16:08