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

问题描述 投票:1回答:1

想象一下,我创建了两个关联类(建筑和人)。一个建筑可以容纳 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

最后,问题是: 是否可以从另一个子类中调用一个子类中的独占方法? 如果可以,那代码是怎样的?如果可以的话,我相信这里有一些铸造,但我不知道如何做到这一点。

先谢谢您的帮助。

java subclass superclass
1个回答
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();
            }
    }
}

P.S.虽然这会帮助你调用Parent的方法,但这是一个不好的做法,虽然对理解语言语义和语法有好处。

几个好的应用设计实践

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

1
投票

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

((Parent) p).setChildBorn();

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.