假設有2個類,乙個類是主力球員,乙個類是替補球員。
publicclass normalplayer
publicstring firstname
publicstring lastname
publicdecimal weeksalary
publicstring getfullname()
publicdecimal getdaysalary()
}
publicclass subplayer
publicstring firstname
publicstring lastname
publicdecimal monthsalary
publicstring getfullname()
publicdecimal getweeksalary()
}
我們發現,normalplayer和subplayer有共同的屬性和方法,當然也有不同的屬性和方法。把2個類的共同部分抽象出乙個基類。
publicclass baseplayer
publicstring firstname
publicstring lastname
publicstring getfullname()
}
然後讓先前的2個類派生於這個基類。
publicclass normalplayer: baseplayer
publicdecimal getdaysalary()
}
publicclass subplayer : baseplayer
publicdecimal getweeksalary()
}
接著,我們發現normalplayer和subplayer計算日薪和周薪的方法也可以抽象出來,作為虛方法放到基類中。
publicclass baseplayer
publicstring firstname
publicstring lastname
publicstring getfullname()
publicvirtual
decimal getsalary()
}
在normalplayer和subplayer這2個派生類中,需要重寫基類的虛方法。
publicclass normalplayer: baseplayer
//獲取日薪
publicoverride
decimal getsalary()
}
publicclass subplayer : baseplayer
//獲取周薪
publicoverride
decimal getsalary()
}
但在實際情況中,baseplayer只是乙個抽象出來的類,我們並不希望例項化這個類。這時候,就可以把baseplayer設計為abstract抽象類。同時,在抽象類中,提供乙個計算薪水的抽象方法。一旦在基類中宣告了沒有方法體的抽象方法,所有派生於這個抽象類的類必須實現或重寫基類中的抽象方法。
publicabstract
class baseplayer
publicstring firstname
publicstring lastname
publicstring getfullname()
publicabstract
decimal getsalary();
}
由此可見,當2個或多個類中有重複部分的時候,我們可以抽象出來乙個基類,如果希望這個基類不能被例項化,就可以把這個基類設計成抽象類。
什麼時候使用抽象類, 什麼時候使用介面
介面是一種協定,抽象類則相當於類模板。使用抽象類,而不要使用介面來分離協定與實現。如果需要提供多型層次結構的值型別,使用介面。如果乙個型別必須實現多個協定,或者協定適用於多種型別,使用介面。雖然抽象類和介面都支援將協定與實現分離開來,但介面不能指定以後版本中的新成員,而抽象類可以根據需要新增成員以支...
什麼時候使用介面,什麼時候使用抽象類
使用抽象類是為了 的復用,而使用介面的動機是為了實現多型性。抽象類適合用來定義某個領域的固有屬性,也就是本質,介面適合用來定義某個領域的擴充套件功能。一 什麼時候使用抽象類?當2個或多個類中有重複部分的時候,我們可以抽象出來乙個基類,如果希望這個基類不能被例項化,就可以把這個基類設計成抽象類。當需要...
什麼時候用介面,什麼時候用抽象類
很多人都認為抽象類和介面都 差不多 於是就隨便選一種來開發專案。其實這是一種非常不明智的做法,若選擇上稍微有些錯誤,到了專案開發後期,這些錯誤將會越來越明顯,越來越大,最後直接導致專案的失敗。在介面和抽象類的選擇上,必須遵守這樣乙個原則 行為模型應該總是通過介面而不是抽象類定義。為了說明其原因,下面...