簡體   English   中英

使用子類的類型或其父類的類型創建子類對象

[英]Creating a subclass object with the subclass's type or its superclass's type

假設我有一個名為Person的超類,它具有私有實例變量的名稱和年齡,以及一個名為Student的子類,它添加了一個名為school的實例變量。 我的父構造函數是:

public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

我的孩子構造函數是:

public Student(String name, int age, String school) {
        super(name, age);
        this.school = school;
    }

我可以通過以下方式用Student構造函數創建一個對象:

Student test = new Student("Joe", 20, "StackOverflow");
Person test = new Student("Joe", 20, "StackOverflow");

我不確定在這種情況下,或者在任何情況下,總的來說是什么,或者兩者中的任何一個是否具有某些優勢。

在這樣的小型程序中,很難看到繼承的好處,尤其是看到以相同方式創建學生和人的能力。

但是,請再想一想,您有一種排序算法,可以對類型“ Person”(人)和僅該類型進行排序。

Person p = new Person(name, age);
ArrayList<Person> list = new ArrayList<Person>();

Sort(list);

其中sort方法僅采用Person類型的列表。

后來您意識到能夠對學生進行排序會很好,但是您不想重寫排序算法。 由於您的排序算法僅針對“人員”類型進行編碼,因此您現在可以將一個學生傳遞但包含在一個人中。 您也可以覆蓋比較方法,以對學生進行排序而不是對人進行排序。 這是一個簡單的示例,還有更多示例。

Person s = new Student(name, age, school);
list.add(s);
Sort(list);

以上都是有效的,您不必重寫任何代碼。 (假設姓名,年齡和學校是正確的類型,等等。)

有幾個原因使您可能希望將引用類型設置為Person 通常,它更抽象,在編碼和閱讀代碼時需要更少的思考。

  • 您的代碼的未來讀者將不必懷疑為什么類型必須是Student ,他們可能會思考並花太多時間試圖弄清楚是否使用了Student特定的操作,或者為什么沒有。
  • 它在編碼時限制了操作/字段的數量,因此可以查看和調用的內容的復雜性較低。 因此,調用錯誤的方法產生錯誤的可能性較小,您所需要的只是可用的。
  • 您可能需要稍后更改Person實例的子類(例如,如果您引入Teacher extends Person ),並且如果選擇將變量聲明為Person ,那么您肯定會不需要更改任何其他行。除了實例化之外,還需要編寫代碼,因為您沒有調用任何在Student中重新定義/重寫/包裝的等效方法(我想如果存在這樣的方法,通常是較差的設計,但可能的話)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM