第三周第五天

類的繼承和多態(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()
    }
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 今天依然學習了成交法則。 在幾位好友咨詢的聊天里,也有刻意用到成交法則,但都沒有成交。我想,可能成交是需要一個過程...
    有梅閱讀 246評論 0 0
  • 營銷不限于微商,成交法則多樣,重要的是活學活用。 今天講的是富蘭克林成交法則和暗示成交法則。 很實用,接地氣! 想...
    Doris186閱讀 199評論 0 0
  • 特種兵常規(guī)作業(yè): 作業(yè)一:每日晨間朋友圈見證(必須在12點之前完成) 作業(yè)二:每天朋友圈心得(當天晚上12點之前完...
    米娜_9228閱讀 285評論 0 0
  • 1, 修改經(jīng)驗分享列表頁面 沒有頁尾的BUG. 頁尾是頁面加載后,AJAX從后臺提取的數(shù)據(jù)生成的. 主要原因, 頁...
    yisky閱讀 102評論 0 0
  • 大家都知道泰語的輔音也是有挺多的,而且也是有好些是同音不同形,不同用的,所以今天我們就通過一個視頻來了解泰...
    愛學習3333閱讀 441評論 0 3

友情鏈接更多精彩內(nèi)容