[英]Java: using setter of a subclass when creating an object of type Superclass
[英]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.