你的问题是:
在一个类中,我可以创建其他类的实例吗?
理论上和技术上,你可以很容易地得到答案“是”。但真正的答案是...“不可以”。因为,如果你这样做:
- 你会将创建实例的类(
Car
)与被创建实例的类(Engine
、Wheels
、FuelTank
)紧密耦合。这样,一辆车总是必须有一个油箱,即使可能会实现纯电力解决方案。
- 汽车不仅要负责行驶在路上,还要自己创建汽车零件。这有点像“变形金刚”。
但是,如果你想正确地学习和应用面向对象编程,那么这两种情况都不是“允许”的选项。这就好比在普通游泳比赛中,你“可以”使用一对鱼鳍,但你会被取消资格。
说到这里,紧耦合唯一可行的替代方案就是松耦合:汽车零件被注入、传递、插入到汽车中。在面向对象编程中,这个过程称为依赖注入(DI)。汽车零件-依赖项-可以很容易地改变或删除。因此,燃油箱可以完全移除,因为汽车将只用电力驱动。汽车本身现在只有一个责任-上路行驶。即使它仍然依赖于它的零件-正如它应该的那样,汽车不再关心汽车零件的创建过程:它只接收它们-正如它应该的那样。
我突然意识到,我会使用另一个概念方案:引擎不应该是汽车零件。只有它插入到汽车中才能成为汽车零件。轮胎和燃油箱也是如此。简而言之,我会用其他方式来定义它们:
class Engine {...}
class Wheels {...}
class FuelTank {...}
class CarEngine extends Engine {...}
class CarWheels extends Wheels {...}
class CarFuelTank extends FuelTank {...}
所以,松耦合将应用如下:
class Car{
Car(instance of CarEngine, instance of CarWheels, instance of CarFuelTank){
}
}
或者更好的是,类比于您的代码版本:
class Car {
Car(instance of Engine, instance of Wheels, instance of FuelTank){
}
}
以下是两个非常好的资源,可以更好地理解这里介绍的原则:
祝你的项目顺利!
编辑1:
@Ryan The Leach 友好地并且正确地向我提出了要向您介绍工厂概念的建议。我会尝试以一种原则性的方式来解释。
汽车需要发动机才能运转。但是谁能生产这个汽车部件呢?嗯:一个发动机工厂。更准确地说是汽车发动机工厂。
在面向对象编程中,工厂是一个专门的类,具有单一职责:创建其他类的实例(听起来很熟悉吧?)。然后,根据它们的有用性,在其他地方使用所创建的实例。现在,当工厂创建一个对象或多个不同类类型的对象时,它可能还需要收集/生产其他资源,以便准备创建最终的“产品”。
因此,发动机工厂首先需要收集/生产大量的发动机零件,然后再组装/创建最终的发动机。汽车工厂也是如此:它需要从发动机工厂获得发动机,从轮胎工厂获得轮胎,从燃油箱工厂获得燃油箱。然后它生产最终的汽车。
在面向对象编程中,有三种类型的工厂,即所谓的工厂模式:
我不会亲自介绍它们,但我会尝试引导您到一些非常好的Web资源,易于理解和跟随:
P.S:
前两个是我的最爱......尽管我还没有看过 :-) 是的,很傻,不是吗?因为它们是相对较新的上传,我不知道它们的存在。但是:我关注了作者的所有其他流,并用三个词来形容:我印象深刻。顺便说一下:作者解释了书籍"Head First Design Patterns"中呈现的所有模式。