目录:
1.重写方法
2.重写属性
3.重写属性观察器
4.构造器在继承中的调用规则
重定写方法:
方法前加override关键字。
class Animal {
var eyes : Int
var month : Int
var nose : Int
var voice : String
init(){
eyes = 2
month = 0
nose = 0
voice = "voice"
}
func description() -> String {
return "\(eyes) eyes ; up to \(month) month"
}
}
class Cat: Animal {
override init() { //重写方法
super.init()
voice = "miao"
}
override var eyes: Int{ //重写属性
get{
return super.eyes
}
set{
super.eyes = max(newValue, 100)
}
}
}
class smallCat: Animal {
var large = 1
override var month: Int{ //属性观察器被重写
didSet{
large = Int(month*2)
}
}
override func description() -> String {
return super.description() + "in gear \(large)"
}
}
let automatic = smallCat()
automatic.month = 1
print("Automatic :\(automatic.description())")
class Food {
var name:String
//指定构造器
init(name:String){
self.name = name
}
//便利构造器
convenience init(){
//调用指定构造器
self.init(name:"[Unnamed]")
}
}
//使用指定构造器创建Food对象
let namedMeat = Food(name:"Bacon")
//使用便利构造器创建Food对象,name的值是“[Unnamed]”
let mysteryMeat = Food()
print(mysteryMeat)
print(namedMeat)
class Food2 {
var name : String
init(name:String){
self.name = "nameStr"
}
init(){
self.name = ""
}
}
class Apple2: Food2 {
}
var apple1 = Apple2() //Apple2
var apple2 = Apple2(name:"apple2") //Apple2
print("apple1 \(apple1.name)") //"apple1 \n"
print("apple2 \(apple2.name)") //"apple2 nameStr\n"
class Food2 {
var name : String
init(name:String){
self.name = "nameStr"
}
init(){
self.name = ""
}
}
class Apple2: Food2 {
override init(name: String) {
super.init()
self.name = "apple2 nameStr"
}
// override init() {
// super.init()
// self.name = ""
// }
}
var apple1 = Apple2() //不可用。子类中必须也重写才可以。没有继承父类。
var apple2 = Apple2(name:"apple2")
print("apple1 \(apple1.name)")
print("apple2 \(apple2.name)")
class Food2 {
var name : String
init(name:String){
self.name = "nameStr"
}
init(){
self.name = ""
}
}
class Apple2: Food2 { //如果构造函数要重写,则所有构造函数都需要被重写
override init(name: String) {
super.init()
self.name = "apple2 nameStr"
}
override init() {
super.init()
self.name = ""
}
}
var apple1 = Apple2()
var apple2 = Apple2(name:"apple2")
print("apple1 \(apple1.name)")
print("apple2 \(apple2.name)")
class Food2 {
var name : String
init(name:String){
self.name = "nameStr"
}
init(){
self.name = ""
}
func test() {
print("this is food2.")
}
}
class Apple2: Food2 {
override func test() {
print("apple2") //被执行
}
}
var apple0 = Apple2()
print("this is \(apple0.test())") //调用要执行