界面反对编程的缺点

时间:2013-09-27 02:14:10

标签: interface parameters extends

class Person{
    private String name;
    private int age;
    private String gender;
    //......
}
class Student extends Person{
    private String id;
    private String schoolBelongTo;
    //......
}


public void showInfoOf(Person person){
    System.out.println(person.getName());
    //......
}

当使用函数“showInfoOf”时,如果使用Peron的对象作为参数,OK。但是,如果它是Student类型,我无法访问字段id和schoolBelongTo。 所以我很困惑,怎么样? 实际上,我想知道这是其中一个(面向接口编程或面向超类的编程)的缺点???

2 个答案:

答案 0 :(得分:0)

在showInfoOf()中,您必须检查该人是否为Student类型,然后将其转换为学生以获取id或schoolBelongsTo

答案 1 :(得分:0)

两种可能的解决方案:

  1. 您可以以编程方式检查showInfoOf (Person)中的类型,并使用强制转换来访问&打印所需的字段;或者,

  2. 您可以在Person上定义一个方法,该方法将打印/提供所需的信息 - 并将showPersonInfo()替换为完全,或将其调用。这是更多的OO方式。

  3. 示例:

    abstract class Person {
        private String name;
        private int age;
        private String gender;
    
        public void printInfo() {
            System.out.println( name);
        }
    }
    class Student extends Person{
        private String id;
        private String schoolBelongTo;
    
        @Override
        public void printInfo() {
            super.printInfo();
            System.out.println( id);
            System.out.println( schoolBelongTo);
        }
    }
    
    
    public void showInfoOf (Person person){
        person.printInfo();
    }
    

    在此示例中,所有功能都已移至Person.printInfo(),并且showInfoOf (Person)中没有真正的功能。

    然而在现实世界中,你可能想要在Person.provideInfo()函数中移动多功能性 - 可能返回一个LinkedHashMap字段&值(因为未标记的值本身并不是很好的设计)。

    showInfoOf (Person)函数可以处理格式化&将值打印到特定要求,保留Person.provideInfo()函数general&多用途。