如何从超级类的关联类中调用子类方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从超级类的关联类中调用子类方法?相关的知识,希望对你有一定的参考价值。
想象一下,我创建了两个关联类(建筑和人)。一个建筑可以容纳 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的细节 所以我把这个类扩展到另外两个类(医生和父母),它们有自己的方法,其中一些方法是针对每个类的。
这段代码。
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上那些是Parent实例的对象(我可以使用instanceof Parent,所以这里没有意义),调用这个方法。
setChildBorn()
.
一个简单的模式是这样的。
Building < association > Person
/ extends
Doctor Parent
最后,问题是: 是否可以从另一个子类中调用一个子类中的独占方法? 如果可以,那代码是怎样的?如果可以的话,我相信这里有一些铸造,但我不知道如何做到这一点。
先谢谢您的帮助。
答案
你可以使用 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的方法,但这是一个不好的做法,虽然对理解语言语义和语法有好处。
几个好的应用设计实践
- 高标和低标模块应该只依赖于抽象。依赖于具体的类而不依赖抽象,会注入高耦合。应用的设计应该实现类与类之间的低耦合和高内聚性。
- 封装(Building不应直接暴露其状态供访问和修改,而应暴露方法来处理其状态)。
- instanceof和casting是一种代码气味,避免这两种。
另一答案
你可以,但你总是有可能得到一个 ClassCastException
如果有 Doctor
中的对象 person
列表,而你忘了使用 instanceof
. 如果没有,假设你把 Person
在一个名为 p
. 然后,要访问方法do。
((Parent) p).setChildBorn();
另一答案
是否可以从另一个子类中调用一个子类中的独占方法?
一个独占方法在其他子类(即同级类)中的可见性与在非同级类中的可见性是一样的,并且遵循同样的 门禁 适用于任何非同龄人类别。
以上是关于如何从超级类的关联类中调用子类方法?的主要内容,如果未能解决你的问题,请参考以下文章