2011-08-05 122 views
4

我有一个持久对象,为了这个问题,我会开车CAR类。关于继承和OOP的问题c#

public class Car 
{ 
    public string model {get;set} 
    public int year {get;set} 
} 

明显极其简化。

现在,随着代码的开发,我自然创建了一个接受CAR作为参数的函数。例如:

public void PaintCar (Car theCar) 
{ 
    //Does some work 
} 

到目前为止好,但后来我有地方,我需要另一个类,这是非常类似的车的场景,但车是缺少一些领域。没问题,我认为OOP救援,我就从车继承,直到结束:

public class SuperCar : Car 
{ 
    public string newProp {get;set} 
    // and some more properties 
} 

再次一切都显得桃色的,直到我碰到一个非常有用的实用功能来我用填充汽车原始属性。

Public void SetCarProperties(Car theCar) 
{ 
    //sets the properties for car here 
} 

我想嗯,我希望我可以使用相同的功能来设置我的superCar类的属性,而不需要重写。我也不想改变基本汽车定义以包含superCar类的所有属性。

在这一点上,我遇到了一个困境。重写会起作用,但这是额外的工作。有没有更优雅的解决方案?基本上我想通过超类传递一个期望基类的函数。这可能与C#?

我的最终代码的结果会是这样的:

Car myCar = new Car(); 
SetCarProperties(myCar); // ALL GOOD 

SuperCar mySuperCar = new SuperCar(); 
SetCarProperties(mySuperCar); // at the moment this function is expecting type Car... 
+2

我认为在Car类中使用'SetCarProperties'方法会更合适,并且可以在子类SuperCar中覆盖它。 – NullUserException

+0

如果不是的话,我认为覆盖将是一个最干净的解决方案。 – NullUserException

回答

12

一个更优雅的解决方案是将功能SetCarPropertiesCar类并覆盖其在SuperCar使用base填补Car的性能和一定的附加代码以填写SuperCar属性。

编辑:也称为多态。

+0

+1这就是我的想法。 – NullUserException

+0

否则被称为非常优雅的解决方案。谢谢! –

+1

你甚至可以更进一步。就像汽车不是自己建造,而是建在工厂里一样,也许多元建筑行为也可能以同样的方式表达。如在中,得到一个更衍生的建设者,而不是使用更多衍生的汽车的方法。 –

2

介绍超驰,但有原始调用基类版本来建立公共属性:

public void SetCarProperties(Car car) 
{ 
    // set general properties 
} 

public void SetCarProperties(SuperCar veyron) 
{ 
    this.SetCarProperties((Car) veyron); 

    // SuperCar specific properties 
} 
+0

您已将层次结构翻转过来,“Car”在这里是基类,它的方法应该被称为第二类。更重要的是,这不是多态的,所以如果你有一个暴露为'Car'的'SuperCar'(一旦这段代码被修复*),它将被编译为使用派生较少的方法并跳过更多派生类的方法完全。 –

+0

@Anthony Pegram:谢谢,修正。我想我被“超级”这个词抛出了。 –

+0

确实,这是一个不幸的用法,特别是如果你来自不同的背景(如Java)。 –

-1

超级瘢痕=汽车作为超级;如果(sCar!=空) { 设置疤痕特性; }

在汽车上设置属性;

+0

类型检查可能会变得无法维护。每次添加新派生汽车时,都必须采用此方法并对其进行更新。 –