类的继承和多态的诠释
一个大类,人
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)正在吃饭")
}
}
老师类 作为人类的子类
//继承从已有的类里面创建一个新类的过程,提供信息的类称为(超类)
//得到继承信息的称为子类(派生类/衍生类)
//通常子类出了的得到父类的继承信息还会增加一些自己特有的东西
//所以子类的能力一定比父类更强大
//继承的意义在于可以子类复用父类的代码并且增强系统现有的功能
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)专业的学生")
print("\(name)正在学习\(courseName)")
}
}
调用和创建对象
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")
方法的重写和调用多态的实现
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)发出了叫声")
}
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)正在捉老鼠")
}
// 父类有的方法子类可以重新实现这个过程叫 方法重写
//需要在方法前添加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)正在玩个球")
}
override func eat() {
print("\(nickName)正在吃屎")
}
override func shout() {
print("\(nickName)正在:汪汪汪。。。。")
}
}
调用和实现
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)接收相同的消息,调用相同的方法
//但是做了不同的事情 这就是多态(polymorphism)
//实现多态的步骤
//1.方法重写(子类在继承父类的过程中对父类已有的方法进行重写,而且不同子类给出各自不同的实现banb)
//2.对象造型(将子类的对象当成父类来使用)
//子类特有的类型进行调用
//可以通过if+as?将父类型安全的转换为子类型然后再调用子类特有方法
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()
}
}