swift继承

来源:互联网 发布:绵投控股网络商学院 编辑:程序博客网 时间:2024/06/05 17:47

/**

1.定义一个基类

2.子类生成

3.重写

4.防止重写

一个类可以继承另一个类的方法,属性和其他特性,在swift中,继承是区分类与其他类型的一个基本特征

类可以调用和访问父类的方法,属性和附属脚本,并且可以重写这些方法,属性和附属脚本来优化或修改它们的行为。

也可以为类中继承来的属性添加属性观察器

*/




//定义基类

/**

不继承于其它类的类,称之为基类(base class)

swift中的类并不是从一个通用的基类继承而来,如果你不为你定义的类指定一个父类,这个类就自动成为基类

*/

class Vehicle {

    var numberOfWheels: Int;

    var maxPassengers:Int;

    func description() -> String {

        return"\(numberOfWheels) wheels; up to\(maxPassengers) passengers";

    }

    init() {

        numberOfWheels =0;

        maxPassengers =1;

    }

}


//子类生成

/**

子类生成指的是在一个已有类的基础上创建一个新的类

class SomeClass: SomeSuperclass { // 类的定义

}

*/

class Bicycle: Vehicle {

    //Override是重写:方法名称、参数个数,类型,顺序,返回值类型都是必须和父类方法一致的。它的关系是父子关系

    override init() {

    super.init();

    numberOfWheels =2;

    }

}

/**

子类只允许修改从父类继承来的变量属性,而不能修改继承来的常量属性

*/

//let a = Bicycle();

//print(a.numberOfWheels);

class Tandem: Bicycle {

    override init() {

    super.init();

    maxPassengers =2;

    }

}

let tandem = Tandem();

print("\(tandem.description())");


//重写(overriding

/**

子类可以为继承来的实例方法、类方法、实例属性、或附属脚本提供自己定制的实现,这种行为叫重写

*/



//重写方法

class Car: Vehicle {

    var speed: Double =0.0;

    override init() {

        super.init();

        maxPassengers =5;

        numberOfWheels =4;

    }

    override func description() ->String {

        returnsuper.description() +";" + "traveling at \(speed) mph";

    }

}

let car = Car();

print(car.description());



//重写属性

/**

可以重写继承来的实例属性或类属性,提供自己定制的gettersetter,或添加属性观察器使重写的属性观察属性值什么时候发生变化

可以将继承来的只读属性重写成读写属性,但不能把读写属性重写成只读属性

如果在重写属性中提供stter,那么一定要提供getter。如果不想在重写版本中的getter里修改继承了的属性值,可以直接返回super,someProperty来返回继承来的值

*/

class SpeedLimitedCar: Car {

    override var speed:Double {

    get {

        return super.speed;

    }

    set {

        super.speed =min(newValue, 40.0);//返回最小的数

    }

    }

}

let limitedCar = SpeedLimitedCar();

limitedCar.speed =60.0;

print(limitedCar.description());



//重写属性观察器

class AutomaticCar: Car {

    var gear = 1;//档位

    override var speed:Double {

        didSet {

        gear = Int(speed /10.0) + 1;

        }

    }

    override func description() ->String {

        return super.description() +"in gear \(gear)";

    }

}


let automatic = AutomaticCar();

automatic.speed = 50.0;

print(automatic.description());


//防止重写

/**

可以通过把方法,属性或附属脚本标记为final来防止它们被重写,只需要在声明关键字前加上@final特性即可

@final func,   @final class func,  @final subscript,  @final var 

*/

0 0