了解 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()
,而且适用于您的所有方法
这可能有点笼统,如果过于笼统,我深表歉意。它与大学 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()
,而且适用于您的所有方法