如何从 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方法我需要:

  1. 遍历建筑物 Person-ListArray 医生所在的位置(没关系,有一种方法可以获取它们)。
  2. 对于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 的方法,但这是一种不好的做法,尽管有助于理解语言语义和语法。

很少有好的应用程序设计实践

  1. 更高和更低的标签模块应该只依赖于抽象。取决于具体 class 而不是抽象会注入高耦合。应设计应用程序以实现 class 之间的低耦合和高内聚性。
  2. 封装(构建不应该直接公开其状态以供访问和修改,而是应该公开处理其状态的方法)
  3. instanceof 和 casting 是一种代码味道,请避免使用它们。