類的繼承和多態(tài)的詮釋
一個大類,人
import Foundation
enum Sex{
case Male ,Famle
}
class Persen {
var name:String
var age:Int
var sex:Sex
init(name:String,age:Int,sex:Sex){
self.age=age
self.name = name
self.sex = sex
}
func eat(){
print("\(name)正在吃飯")
}
}
老師類 作為人類的子類
//繼承從已有的類里面創(chuàng)建一個新類的過程,提供信息的類稱為(超類)
//得到繼承信息的稱為子類(派生類/衍生類)
//通常子類出了的得到父類的繼承信息還會增加一些自己特有的東西
//所以子類的能力一定比父類更強大
//繼承的意義在于可以子類復用父類的代碼并且增強系統(tǒng)現(xiàn)有的功能
import Foundation
enum Prot{
case Hight,Mid,Low
}
//繼承的語法是:加父類名
class Techer:Persen {
var prot:Prot
init(name :String,age:Int,sex:Sex,prot:Prot){
self.prot = prot
//初始化可以繼承父類哪里的
super.init(name: name, age: age, sex: sex)
}
func teache(courseName:String){
print("\(name)正在教\(courseName)")
}
}
學生類 人 類的子類之一
import Foundation
class Student:Persen{
var major:String
init(name: String,age: Int,major: String,sex: Sex){
self.major = major
super.init(name: name, age: age, sex: sex)
}
func stdudy(courseName:String){
print("\(sex == .Male ? "他":"她")\(name)是\(major)專業(yè)的學生")
print("\(name)正在學習\(courseName)")
}
}
調(diào)用和創(chuàng)建對象
let p1 = Persen(name: "王大錘", age: 25, sex: .Male)
p1.eat()
//可以將子類型的對象賦值給父類型的變量(因為子類跟父類之間是IS——A關系)
//學生是人,老師是人所以學生和老師對象可以賦值給人類型的變量
let p2:Persen = Student(name: "張尼瑪", age: 18, major: "計算機科學", sex: .Famle)
p2.eat()
//如果將父類型的變量轉換成子類型需要用as運算符進行,類型轉換
//如果能夠確認父類型的變量就是某種子類型的對象可以用as!進行轉換
//如果不確定父類型的變量中是那種子類型可以用as?嘗試轉換
(p2 as! Student).stdudy("swift")
if let temp = p2 as? Techer {
temp.teache("Java")
}
else{
print("\(p2.name)不是老師")
}
let p3 = Techer(name: "羅浩", age: 35, sex: .Male, prot: .Low)
p3.teache("swift")
方法的重寫和調(diào)用多態(tài)的實現(xiàn)
import Foundation
enum Gender{
case Male ,Female
}
class Pet {
var nickName:String
var gender:Gender
var age:Int
init(gender:Gender,age:Int,nickName:String){
self.gender=gender
self.age = age
self.nickName = nickName
}
func play(){
print("\(nickName)正在玩耍")
}
func shout(){
print("\(nickName)發(fā)出了叫聲")
}
func eat(){
print("\(nickName)正在吃飯")
}
}
子類一貓
import Cocoa
class Cat: Pet {
var haircolor:String
init(gender: Gender, age: Int, nickName: String,haircolor:String) {
self.haircolor = haircolor
super.init(gender: gender, age: age, nickName: nickName)
}
func catchTheMouse(){
print("\(nickName)正在捉老鼠")
}
// 父類有的方法子類可以重新實現(xiàn)這個過程叫 方法重寫
//需要在方法前添加override關鍵詞
//重寫有時候也被叫做 置換或覆蓋或復寫
override func shout() {
print("\(nickName):喵喵喵。。。。")
}
override func play() {
super.play()
print("\(nickName)正在玩毛線。。。。")
}
}
子類2狗
import Cocoa
class Dog: Pet {
var haircolor:String
init(gender: Gender, age: Int, nickName: String,haircolor:String) {
self.haircolor = haircolor
super.init(gender:gender, age:age , nickName: nickName)
}
func lookoutTheDoor(){
print("\(nickName)正在看家")
}
override func play() {
print("\(nickName)正在玩?zhèn)€球")
}
override func eat() {
print("\(nickName)正在吃屎")
}
override func shout() {
print("\(nickName)正在:汪汪汪。。。。")
}
}
調(diào)用和實現(xiàn)
let petsArray = [
Cat(gender: .Male, age: 2, nickName: "肥肥", haircolor: "baise"),
Dog(gender: .Male, age: 3, nickName: "易金金金金", haircolor: "黑色"),
Dog(gender: .Female, age: 6, nickName: "曾世平", haircolor: "白色"),
Mistress(gender: .Male, age: 20, nickName: "花花")
]
for pet in petsArray{
// pet.eat()
// pet.play()
pet.shout()
//同樣的對象類型(Pet)接收相同的消息,調(diào)用相同的方法
//但是做了不同的事情 這就是多態(tài)(polymorphism)
//實現(xiàn)多態(tài)的步驟
//1.方法重寫(子類在繼承父類的過程中對父類已有的方法進行重寫,而且不同子類給出各自不同的實現(xiàn)banb)
//2.對象造型(將子類的對象當成父類來使用)
//子類特有的類型進行調(diào)用
//可以通過if+as?將父類型安全的轉換為子類型然后再調(diào)用子類特有方法
if let pet = pet as? Dog{
pet.lookoutTheDoor()
}
else{
print("你以為你是易金金金金嗦")
}
if let pet = pet as? Cat{
pet.catchTheMouse()
}
if let pet = pet as? Mistress{
pet.makeTroble()
}
}