了解 Java Super 和 Sub class 构造函数和方法之间的关系

Understanding relationship between Java Super and Sub class constructors and methods

这可能有点笼统,如果过于笼统,我深表歉意。它与大学 class 的作业有关,因此我想关注我对该主题的理解,而不是答案应该是什么。 据我了解情况: 我有一个父 class 叫宠物,还有两个子 class 叫狗和猫。 UML class 图指定 Pet 包含方法 createPet()updatePet()petCheckIn()petCheckIn() 需要能够创建一个对象(如果还没有),如果已经存在则更新一个。

这两个子class包含默认构造函数,以及它们属性的设置器和获取器,但没有其他特定于它们的东西。

我不相信会有需要 Pet 对象的实例,因为被登记的宠物总是狗或猫。如果子class继承的不是构造函数,而是方法,并且createPet()严格来说不是构造函数,如果设计得当,继承的方法是否可以执行构造函数?我觉得实现应该是这样的(不关心确切的语法,因为我对这里可以做什么和不能做什么的理解):

我的伪代码:

Execute Dog/Cat inherited petCheckIn()
   IF new pet THEN
      Execute Dog/Cat inherited createPet()

   ELSE
      Execute Dog/Cat inherited updatePet()

这是入门级编程class,所以我无法想象实现会非常复杂。 可能我误解了 something/overcomplicating。

无论如何,感谢您的宝贵时间。

编辑: 真的很抱歉,我没有回复你@Karam 和@Chung。生活有时像货运火车一样,哈哈。指定另一个 class 超出了赋值范围(尽管我想知道的大部分内容似乎也是如此),没有指定任何关于签名的内容(那是 methodName + 它的参数正确吗?)。最终,我认为很大程度上取决于 classes 将如何由未详细介绍的整体计划实施。我可以非常自信地说,我只是在问一些超出课程计划那个阶段的意图的问题。我最终在 super class 中使用了一个带参数的构造函数,在 subclass 中使用了另一个构造函数,它将 superclass 字段的参数传递给 superclass 构造函数,然后初始化了subclass 特定字段。卡拉姆,我从来没有真正定义调用构造函数的方法,也无法自学设计模式,但我的一个亲戚也提到了一个抽象工厂。我说这可能是处理它的最佳方式。不幸的是,我现在没有更多时间深入研究这个问题,所以我认为它很好。

无法告诉你们我是多么感谢你们愿意提供帮助。

Dog.java构造函数:

    //Overloaded Constructor that passes parameters to Superclass 
    constructor.
    //TODO: Reconsider which fields need a parameter and which can be set to 
    default at this point in the program. 
    //TODO: Verify that not passing an argument for catSpace will default to 
    -1.
    //FIXME: Is dogSpaceNBR known at this point in program?
    public Dog(int dogSpaceNBRInput, double dogWeightInput, boolean 
    groomingInput, String petTypeInput, String petNameInput, int petAgeInput, 
    int dogSpaceInput, int catSpaceInput, int daysStayInput, double 
    amountDueInput) {  

    // Passes arguments common to all pet subclasses to superclass 
    constructor.
    super(petTypeInput, petNameInput, petAgeInput, dogSpaceInput, 
    catSpaceInput, daysStayInput, amountDueInput); 

    //Dog specific variables
    dogSpaceNbr = dogSpaceNBRInput; 
    dogWeight = dogWeightInput;
    grooming = groomingInput;
    }

如果我很理解你的问题,你希望能够根据子class 仅使用方法

创建不同的宠物实例

有一种设计模式叫做抽象工厂,它用于以具体的方式忽略不同方法的创建

示例:

您有包含方法 createPet() {}

class Pet它应该是抽象的

在您的 sublcass 中,您只需重新定义方法 createPet() { return new Dog() ; /* or */ return new Cat() ;}

这可以帮助您在创建新的 sublcass 时重新定义方法而不更改原始 class ,这不仅适用于方法 createPet(),而且适用于您的所有方法