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にアクセスできません。だから私は混乱しています、どうすればいいですか?実際、私が知りたいのは、これがその(インターフェース指向プログラミングまたはSupperクラス指向プログラミングの)欠点の1つですか???

4

2 に答える 2

0

showInfoOf() では、その人物が Student タイプであることを確認し、それを Student としてキャストして ID または schoolBelongsTo を取得する必要があります。

于 2013-09-27T02:24:28.363 に答える
0

考えられる解決策は次の 2 つです。

  1. の型をプログラムでチェックしshowInfoOf (Person)、キャストを使用して目的のフィールドにアクセスして出力できます。また、

  2. 必要な情報を出力/提供する Person のメソッドを定義できます-そして、それを完全に置き換えるかshowPersonInfo()、それを呼び出します。これはよりオブジェクト指向の方法です。

例:

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 に答える