【问题标题】:How to call a subclass method from super's associated class如何从super的关联类调用子类方法
【发布时间】:2020-05-06 20:05:46
【问题描述】:

假设我创建了两个相关的类(Building 和 Person)。一座建筑物可以容纳 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
   }
}

所以,一旦到达这里,从maternityWardmethod 我需要:

  1. 遍历 Doctor 所在的 Building 的 Person-ListArray(没关系,有一种方法可以获取它们)。
  2. 对于ListArray上的那些是Parent实例的对象(我可以使用instanceof Parent,这里没有意义),调用方法setChildBorn()

一个简短的架构是这样的:

Building < association > Person
                       / extends \ 
                    Doctor     Parent

最后,问题是:是否可以从另一个子类调用子类中的独占方法? 如果是,该代码将如何? 如果可能的话,我相信这里有一些演员表,但我不知道该怎么做。

提前感谢您的帮助。

【问题讨论】:

  • 只使用instanceof然后强制转换

标签: java subclass superclass


【解决方案1】:

您可以使用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();
            }
    }
}

附: 尽管这将帮助您调用 Parent 的方法,但这是一种不好的做法,尽管有助于理解语言语义和语法。

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

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

【讨论】:

  • 非常感谢@nits.kk 提供的所有详细信息,这正是我期望得到的答案。
【解决方案2】:

可以,但如果person 列表中有Doctor 对象,并且您忘记使用instanceof,您总是有获得ClassCastException 的风险。如果没有,假设您将Person 存储在一个名为p 的变量中。然后,访问该方法:

((Parent) p).setChildBorn();

【讨论】:

  • 感谢@Higigig,简短但具体的解释。
【解决方案3】:

是否可以从另一个子类中调用独占方法 子类?

独占方法在其他子类(即同级类)中的可见性与在非同级类中的可见性相同,并且它遵循适用于任何非同级类的相同access control

【讨论】:

  • 感谢您的回答@Arvind,从理论上讲,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-08-08
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2020-03-03
  • 2020-03-01
  • 2015-12-06
相关资源
最近更新 更多