如何从 super 的关联 class 调用 subclass 方法
How to call a subclass method from super's associated class
假设我创建了两个关联的 classes(建筑和人物)。一栋楼可以容纳n人(人),一个人一次只能在一栋楼里。
到目前为止的代码(只是其中的相关部分)是:
public class Building {
//some attributes like name, location...
private List<Person> person;
//constructor
//some methods
}
public class Person {
//some attributes like name, age...
private Building building;
//constructor
//some methods
}
好的,现在我需要了解有关 Person 的更多详细信息,所以我将此 class 扩展到其他两个(医生和 Parents),它们有自己的方法,其中一些特定于每个 Class.
代码:
public class Parent extends Person {
// some specific attributs
public boolean born;
//constructor
//some methods
public void setChildBorn() {
this.born = true;
}
}
public class Doctor extends Person {
// some specific attributs
// constructor
// some methods
public void maternityWard() {
//HERE THE QUESTION
}
}
所以,一旦到达这里,从maternityWard
方法我需要:
- 遍历建筑物 Person-ListArray 医生所在的位置(没关系,有一种方法可以获取它们)。
- 对于ListArray 上的objects 是Parent 的实例(我可以使用instanceof Parent,所以这里没有意义),调用方法
setChildBorn()
。
一个简短的模式是这样的:
Building < association > Person
/ extends \
Doctor Parent
最后,问题:是否可以从另一个子class调用子class中的独占方法?
如果是,该代码将如何?
如果可能的话,我相信这里有一些转换,但我不确定该怎么做。
在此先感谢您的帮助。
可以,但是如果 person
列表中有一个 Doctor
对象,而您忘记使用 [=14=,那么您总是有得到 ClassCastException
的风险].如果不是,假设您将 Person
存储在名为 p
的变量中。然后,访问方法:
((Parent) p).setChildBorn();
Is it possible to call an exclusive method in a subclass from another
subclass?
独占方法在其他子classes(即兄弟classes)中的可见性与在非兄弟class中的可见性相同,并且遵循相同的access control 适用于任何非兄弟 class.
您可以使用 instanceof
运算符和转换
来做到这一点
public class Doctor extends Person {
//..some code
public void maternityWard() {
for(Person p : building.getPersonList()){
if(p instanceof Parent){
Parent parent = (Parent)p;
parent.setChildBorn();
}
}
}
P.S。
虽然这将帮助您调用 Parent 的方法,但这是一种不好的做法,尽管有助于理解语言语义和语法。
很少有好的应用程序设计实践
- 更高和更低的标签模块应该只依赖于抽象。取决于具体 class 而不是抽象会注入高耦合。应设计应用程序以实现 class 之间的低耦合和高内聚性。
- 封装(构建不应该直接公开其状态以供访问和修改,而是应该公开处理其状态的方法)
- instanceof 和 casting 是一种代码味道,请避免使用它们。
假设我创建了两个关联的 classes(建筑和人物)。一栋楼可以容纳n人(人),一个人一次只能在一栋楼里。
到目前为止的代码(只是其中的相关部分)是:
public class Building {
//some attributes like name, location...
private List<Person> person;
//constructor
//some methods
}
public class Person {
//some attributes like name, age...
private Building building;
//constructor
//some methods
}
好的,现在我需要了解有关 Person 的更多详细信息,所以我将此 class 扩展到其他两个(医生和 Parents),它们有自己的方法,其中一些特定于每个 Class.
代码:
public class Parent extends Person {
// some specific attributs
public boolean born;
//constructor
//some methods
public void setChildBorn() {
this.born = true;
}
}
public class Doctor extends Person {
// some specific attributs
// constructor
// some methods
public void maternityWard() {
//HERE THE QUESTION
}
}
所以,一旦到达这里,从maternityWard
方法我需要:
- 遍历建筑物 Person-ListArray 医生所在的位置(没关系,有一种方法可以获取它们)。
- 对于ListArray 上的objects 是Parent 的实例(我可以使用instanceof Parent,所以这里没有意义),调用方法
setChildBorn()
。
一个简短的模式是这样的:
Building < association > Person
/ extends \
Doctor Parent
最后,问题:是否可以从另一个子class调用子class中的独占方法? 如果是,该代码将如何? 如果可能的话,我相信这里有一些转换,但我不确定该怎么做。
在此先感谢您的帮助。
可以,但是如果 person
列表中有一个 Doctor
对象,而您忘记使用 [=14=,那么您总是有得到 ClassCastException
的风险].如果不是,假设您将 Person
存储在名为 p
的变量中。然后,访问方法:
((Parent) p).setChildBorn();
Is it possible to call an exclusive method in a subclass from another subclass?
独占方法在其他子classes(即兄弟classes)中的可见性与在非兄弟class中的可见性相同,并且遵循相同的access control 适用于任何非兄弟 class.
您可以使用 instanceof
运算符和转换
public class Doctor extends Person {
//..some code
public void maternityWard() {
for(Person p : building.getPersonList()){
if(p instanceof Parent){
Parent parent = (Parent)p;
parent.setChildBorn();
}
}
}
P.S。 虽然这将帮助您调用 Parent 的方法,但这是一种不好的做法,尽管有助于理解语言语义和语法。
很少有好的应用程序设计实践
- 更高和更低的标签模块应该只依赖于抽象。取决于具体 class 而不是抽象会注入高耦合。应设计应用程序以实现 class 之间的低耦合和高内聚性。
- 封装(构建不应该直接公开其状态以供访问和修改,而是应该公开处理其状态的方法)
- instanceof 和 casting 是一种代码味道,请避免使用它们。