我正在学习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){
//...
}
}
这里有两个很棒的资源,可以更好地理解这里介绍的原理:
祝您项目顺利!
编辑1:
@Ryan Leach诚恳地建议我也向您介绍工厂的概念/概念。我将尝试以原则方式进行。
汽车需要引擎才能运行。但是谁能生产这款汽车零件呢?好吧:一家发动机工厂。更确切地说是汽车发动机工厂。
就OOP而言,工厂是专门负责一个类的类:创建其他类的实例(听起来很熟悉?)。然后根据其用途将创建的实例用于其他地方。现在,当工厂创建一个或多个不同类类型的对象时,为了准备最终“产品”的创建,工厂可能也需要收集/生产其他资源。
因此,在组装/制造最终发动机之前,发动机工厂首先需要收集/生产大量发动机零件。同样适用于汽车制造厂:它需要从发动机制造厂接收发动机,从车轮制造厂接收车轮,从燃料箱工厂接收燃油箱。然后生产最终的汽车。
在OOP中,存在三种类型的工厂,例如所谓的工厂模式:
我不会在这里亲自介绍它们,但会尝试将您引向一些(非常)好的网络资源,这些资源易于理解和理解:
附言:
前两个是我的最爱...虽然我还没有看过它们:-)是的,很傻,不是吗?因为它们是相对较新的上载,所以我不知道它们是否存在。但是:我关注了作者的所有其他内容,并用三个词表示:我印象深刻。注意:作者解释了“Head First设计模式”一书中介绍的所有模式。
关于java - 从基类构造函数创建子类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680613/