0
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。所以我很困惑,怎么办?实际上,我想知道这是它(面向接口的编程或面向超级类的编程)的缺点之一???

4

2 回答 2

0

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

于 2013-09-27T02:24:28.363 回答
0

两种可能的解决方案:

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

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

例子:

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()函数具有通用性和多用途性。

于 2013-09-27T02:29:09.803 回答