如何从超级类的关联类中调用子类方法?

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方法,我需要。

  1. 遍历大楼里博士所在的Person -ListArray(没关系,有一个方法可以得到他们)。
  2. 对于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的方法,但这是一个不好的做法,虽然对理解语言语义和语法有好处。

几个好的应用设计实践

  1. 高标和低标模块应该只依赖于抽象。依赖于具体的类而不依赖抽象,会注入高耦合。应用的设计应该实现类与类之间的低耦合和高内聚性。
  2. 封装(Building不应直接暴露其状态供访问和修改,而应暴露方法来处理其状态)。
  3. instanceof和casting是一种代码气味,避免这两种。
另一答案

你可以,但你总是有可能得到一个 ClassCastException 如果有 Doctor 中的对象 person 列表,而你忘了使用 instanceof. 如果没有,假设你把 Person 在一个名为 p. 然后,要访问方法do。

((Parent) p).setChildBorn();
另一答案

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

一个独占方法在其他子类(即同级类)中的可见性与在非同级类中的可见性是一样的,并且遵循同样的 门禁 适用于任何非同龄人类别。

以上是关于如何从超级类的关联类中调用子类方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中调用另一个类中子类里的一个变量?

从另一个类创建超级视图的子视图不起作用

java(面向对象)中,子类如何调用父类的构造方法?分别从无参和有参角度

如何在java中子类中父类的对象如何调用父类的方法?

如何在java中调用另一个类中子类里的一个变量?

请教,父类中如何调用子类中的虚函数