java - 从基类构造函数创建子类实例

标签 java oop inheritance constructor

我正在学习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)与创建实例的的类(EngineWheelsFuelTank)紧密耦合。这样,即使可以实施仅采用电力的解决方案,汽车也将始终必须具有燃油箱。
  • 汽车不仅有责任在道路上行驶,而且还具有自行制造汽车零件的责任。这就是“变形金刚”之类的东西。

  • 但是,如果您想正确学习和应用OOP,那么这两种情况都不是“允许的”选择。就像是一样:在正常的游泳比赛中,您的可以使用一对脚蹼,但是您将被取消资格。

    就是说,紧耦合唯一可行的替代方法是松耦合:汽车零件已注入,例如通过,例如插入汽车。在OOP中,此过程的名称为依赖项注入(DI)。汽车零件-依存关系-然后可以轻松更改或删除。因此,由于仅用电力驱动汽车,因此可以完全卸下油箱。现在,汽车本身仅具有在道路上行驶的责任。而且,即使它仍然依赖于零件(应按部就班),汽车也不再关心汽车零件的创建过程:它只是应收到零件而已。

    我刚刚意识到,我将使用另一种概念方案:Engine不应是CarPart。只有将其插入汽车中的事实才能使其成为汽车的一部分。 WheelsFuelTank也是如此。简而言之,我将以其他方式定义它们:
    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){
            //...
        }
    
    }
    

    这里有两个很棒的资源,可以更好地理解这里介绍的原理:
  • The Clean Code Talks - Don't Look For Things!
  • Slutty Software is good software: Tight and loose coupling in OOP

  • 祝您项目顺利!

    编辑1:

    @Ryan Leach诚恳地建议我也向您介绍工厂的概念/概念。我将尝试以原则方式进行。

    汽车需要引擎才能运行。但是谁能生产这款汽车零件呢?好吧:一家发动机工厂。更确切地说是汽车发动机工厂。

    就OOP而言,工厂是专门负责一个类的类:创建其他类的实例(听起来很熟悉?)。然后根据其用途将创建的实例用于其他地方。现在,当工厂创建一个或多个不同类类型的对象时,为了准备最终“产品”的创建,工厂可能也需要收集/生产其他资源。

    因此,在组装/制造最终发动机之前,发动机工厂首先需要收集/生产大量发动机零件。同样适用于汽车制造厂:它需要从发动机制造厂接收发动机,从车轮制造厂接收车轮,从燃料箱工厂接收燃油箱。然后生产最终的汽车。

    在OOP中,存在三种类型的工厂,例如所谓的工厂模式:
  • 简单工厂
  • 工厂方法
  • 抽象工厂

  • 我不会在这里亲自介绍它们,但会尝试将您引向一些(非常)好的网络资源,这些资源易于理解和理解:
  • Factory Method Pattern – Head First Design Patterns (ep 04)
  • Abstract Factory Pattern – Head First Design Patterns (ep 05)
  • Abstract Factory Design Pattern
  • Abstract Factory Design Pattern... (关于使用模式来组装和创建数据库连接,有一个很好的说明)
  • Factory Method vs Abstract Factory (非常容易理解的图)

  • 附言:

    前两个是我的最爱...虽然我还没有看过它们:-)是的,很傻,不是吗?因为它们是相对较新的上载,所以我不知道它们是否存在。但是:我关注了作者的所有其他内容,并用三个词表示:我印象深刻。注意:作者解释了“Head First设计模式”一书中介绍的所有模式。

    关于java - 从基类构造函数创建子类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680613/

    相关文章:

    c++ - 调用虚函数的逻辑不清晰(或者是方法隐藏?)

    c++ - 无法访问继承的变量

    java - 将 Post 请求中的 String 参数和对象传递给 RESTful 服务

    java - 在 Kotlin/Java 变量名称中使用特殊字符 "$"

    java - 如何编辑 Android 对话框标题

    python - 添加后删除实例

    java - 为什么 Java 集合的删除方法不是通用的?

    java - 观察者模式 vs 事件总线消息方法

    java - 继承和HAS-A关系

    c# - 设置基类变量的值?