如何避免在本作业中使用instanceof?

时间:2019-05-25 21:17:42

标签: java interface instanceof

所以我的教授给了我这样的UML。。有一天,我和一个朋友聊天,他说使用instanceOf是一种不好的做法。

在此示例中,如何避免使用它?

在修改方法中,我必须使用instanceOf来检查我是否拥有教授或学生的实例,然后进行切换以修改对象的每个属性。

他还告诉我,在班级部门中实现该接口是没有意义的。应该在Person类中实现该接口。

任何有关改进此练习的帮助或指导都将很棒!

public interface Iactions{
  void add(Object o);
  void delete(Object o);
  void modify(Object o);
  void show(Object o);
}


    public class Department implement Iactions{
    // Attributes
    ArrayList<Person> myGroupPersons;

    // Implementing the methods from interface Iactions

    @Override
    public void modify(Object o) {
        if (o instanceof Professor) {
            modifyProfessor((Professor) o);
        } else if (o instanceof Student) {
            modifyStudent((Student) o);
        }
      }
   }

public class Person {
  // code
}

public class Profesor extends Person{
  // code
}

public class Student extends Person{
  // code
}

很抱歉缺少信息: 添加和删​​除一个方法,该方法可以插入对象并从arrayList中删除对象。 为了显示,我认为这只是arrayList的打印。 修改后,我需要有一个菜单,可以在其中选择要修改的对象的属性。

这是我的猜测,因为他只给了我们UML(我没有写这个uml),而他没有说其他话。

2 个答案:

答案 0 :(得分:0)

Instanceof的用法不错,但总体上说它的设计不好。

Person类可以是抽象的,并且可以修改方法。 在学生和教授中,您都有自己的方法实现。 这样,您无需使用

if (Object instanceof Student){
//code
}

但相反:

Object.modify();

关于界面部分,其工作方式相同。

public class Person implements Iactions {

public void modify(){
//code
}
}

//then call this
student.modify();

答案 1 :(得分:0)

我建议您可以在Java中使用泛型。像这样:

public class People {
    String name;

    public People() {
    }
}


public interface IAction<T> {
    void add(T o);
    void delete(T o);
    void modify(T o);
}


public class Departement  implements IAction<People> {

    @Override
    public void add(People o) {
        // TODO Auto-generated method stub

    }

    @Override
    public void delete(People o) {
        // TODO Auto-generated method stub

    }

    @Override
    public void modify(People o) {
        // TODO Auto-generated method stub

    }

}