我正在学习Java的OOP。假设我有一个基类Car,它的子类扩展了Car,称为Engine,FuelTank和Wheels。是否可以从Car的基类实例化这些扩展类,以使car的每个实例对每个子类都有自己的实例?
class Car{
Car(){
// instance of Engine
// instance of Wheels
// instance of FuelTank
}
}
class CarPart{}
class Engine extends CarPart{}
class Wheels extends CarPart{}
class FuelTank extends CarPart{}
您的问题是:
在一个类中,我可以创建其他类的实例吗?
从理论上和技术上,您都可以轻松地获得“是”的答案。但是真正的答案是……“不”。因为,如果您这样做:
Car
)的类从中创建的实例(Engine
,Wheels
,FuelTank
)。这样,即使可以实施仅采用电力的解决方案,汽车也将始终必须具有燃油箱。但是,如果您想正确学习和应用OOP,那么这两种情况都不是“允许的”选择。就像:在正常的游泳比赛中,您可以使用一副脚蹼,但是您将失去资格。
也就是说,紧密联轴器唯一可行的选择是松散联轴器:将汽车零件注入(例如通过),例如插入汽车。在OOP中,此过程具有名称依赖项注入(DI)。然后可以轻松地更改或删除汽车零件-依存关系。因此,由于仅用电力驱动汽车,因此可以完全卸下油箱。现在,汽车本身仅具有在道路上行驶的责任。而且,即使它仍然依赖于其零件-确实应该,它也不再关心汽车零件的创建过程:它只是应该接收它们-而应该这样做。
我刚刚意识到,我会使用另一种概念方案:Engine
不应为CarPart
。只有将其插入汽车中的事实才能使其成为汽车的一部分。这同样适用于在Wheels
和FuelTank
。简而言之,我将以其他方式定义它们:
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){
//...
}
}
这里有两个很棒的资源,可以更好地理解这里介绍的原理:
祝您项目顺利!
@Ryan Leach诚恳地建议我也向您介绍factory的概念。我将尝试以原则方式进行。
汽车需要引擎才能运行。但是谁能生产这款汽车零件呢?好吧:一家发动机工厂。更确切地说是汽车发动机工厂。
就OOP而言,工厂是专门负责一个职责的类:创建其他类的实例(听起来很熟悉吗?)。然后根据其用途将创建的实例用于其他地方。现在,当工厂创建一个或多个不同类类型的对象时,为了准备最终“产品”的创建,它可能也需要收集/产生其他资源。
因此,在组装/制造最终发动机之前,发动机工厂首先需要收集/生产许多发动机零件。同样适用于汽车制造厂:它需要从发动机制造厂接收发动机,从车轮制造厂接收车轮,从燃油箱工厂接收燃油箱。然后生产最终的汽车。
在OOP中,存在三种类型的工厂,例如所谓的工厂模式:
我不会在这里亲自介绍它们,但会尝试将您引向一些(非常)好的网络资源,这些资源易于理解和理解:
PS:
前两个是我的最爱...虽然我还没有看过它们:-)是的,很傻,不是吗?因为它们是相对较新的上载,所以我不知道它们是否存在。但是:我关注了作者的所有其他内容,并用三个词表示:我印象深刻。注意:作者解释了“ Head First设计模式”一书中介绍的所有模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句