【问题标题】:Understanding relationship between Java Super and Sub class constructors and methods了解 Java 超类和子类构造函数和方法之间的关系
【发布时间】:2020-09-10 12:20:12
【问题描述】:

这可能有点笼统,如果过于笼统,我深表歉意。它与大学课程的作业有关,因此我想专注于我对该主题的理解,而不是答案应该是什么。 据我了解情况: 我有一个名为 pet 的父类,以及两个名为 Dog 和 Cat 的子类。 UML 类 Diagrams 指定 Pet 包含方法 createPet()updatePet()petCheckIn()petCheckIn() 需要能够创建一个对象(如果它还没有的话),如果有的话就更新一个。

这两个子类包含默认构造函数,以及它们的属性的 setter 和 getter,但没有其他特定于它们的东西。

我认为不会出现需要 Pet 对象的情况,因为登记入住的宠物始终是狗或猫。如果构造函数不被子类继承,但方法被继承,并且createPet()严格来说不是构造函数,如果设计得当,继承的方法可以执行构造函数吗?我觉得实现应该是这样的(不关心确切的语法,就像我对这里可以做什么和不能做什么的理解一样):

我的伪代码:

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

   ELSE
      Execute Dog/Cat inherited updatePet()

这是一个入门级的编程课程,所以我无法想象实现会非常复杂。 可能我误解了一些东西/过于复杂。

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

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

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

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;
    }

【问题讨论】:

  • 我希望我能很好地理解你的问题,你可以看到我的回答并告诉我这是否真的是你想要的
  • 是否允许更改方法签名或创建其他类?假设您列出的所有方法(包括构造函数)都是公共的,那么拥有 createPet() 方法有点令人困惑。因为您首先需要一个实际的 Pet 实例来调用该方法。因此,如果无法更改方法签名并且您无法创建任何其他类,那么我有充分的理由相信您可能误解了该作业的某些内容,或者只是没有提及一些重要的细节。

标签: java inheritance constructor subclass superclass


【解决方案1】:

如果我能很好地理解您的问题,您希望能够根据子类仅使用方法创建不同的宠物实例

有一种设计模式叫Abstract Factory,它是用来具体忽略不同方法的创建

例子:

你有包含方法createPet() {}class Pet应该是抽象的

在您的 sublcas 中,您必须简单地重新定义方法 createPet() { return new Dog() ; /* or */ return new Cat() ;}

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

【讨论】:

  • 卡拉姆,我想我明白了这件事的发展方向,应该适合这个目的。听起来我可以将方法用作构造函数,如果我正确理解您的建议,我将不得不在每个子类中手动编写重新定义的“createPet()”。话虽如此,它与 UML 类图(不一定是世界末日)不一致。你认为在指向子类特定构造函数的原始“createPet()”中放置一个 IF-ELSE 分支会做类似的事情吗?也可以直接把分支放到构造函数中。
  • 抱歉,编辑时分心了,超时了。
  • 这种设计模式不像 IF-ELSE ,它更好,帮助很大
  • @JoshuaHawley 标记我的问题,如果您能得到帮助,我们将不胜感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2018-08-10
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多