您的位置:首页 > 移动开发 > Swift

Swift基础(七):继承、构造过程

2016-06-18 15:05 363 查看
目录:

1.继承:重写等

2.构造过程:指定构造器、便利构造器、可失败构造器、必要构造器等

//1.继承

//重写

class Animal

{

    var age:Int =
0;

    var weight:Double =
0.0;

    func shout()

    {

        print("animal shout!");

    }

};

class Dog : Animal

{

    

    var shoutContent:String

    {

        return
"Dog bark!";

    }

    override func shout()

    {

        print(shoutContent);

    }

};

var dog = Dog();

dog.shout();

//重写属性getter和setter以及属性观察器

class Person

{

    var name: String;
//存储属性

    var age: Int
; //存储属性

    var height: Double;

    

    func description() ->
String

    {

        return
"\(name)
年龄是:
\(age),高度是:\(height)";

    }

    

    init (name: String, age:
Int ,height: Double)

    {

        self.name = name;

        self.age  = age;

        self.height = height;

    }

}

class Student: Person

{

    

    var school: String;

    override var height:
Double

    {

        willSet

        { //如果只关注修改之前的调用,可以只重写willSet观察者

            print("学生身高新值:\(newValue)");

            

        }

        didSet

        { //如果只关注修改之后的调用,可以只重写didSet观察者

            print("学生年身高旧值:\(oldValue)");

        }

    }

    override var age:
Int

    { //重写属性前面要添加override关键字

        get

        {

            return
super.age;

        }

        set

        {

            super.age = newValue <
8 ? 8: newValue;

        }

       

    }

    convenience
init()

    {

        self.init(name:
"Tony", age: 18,height:
172, school: "清华大学");

    }

    

    init (name: String, age:
Int,height: Double, school:
String)

    {

        self.school = school;

        super.init(name: name, age: age,height: height);

    }

}

let student = Student();

student.height =
175;

//防止重写:在属性前加上final

//2.构造过程

//存储属性的构造:默认属性值、构造器

class TestClass

{

    var name: String;
//存储属性

    var age: Int
; //存储属性

    var temperature =
32.0; //默认属性值

    init (name: String, age:
Int)//构造器

    {

        self.name = name;

        self.age  = age;

    }

};

//带外部和内部参数名的构造器和不带外部参数的构造器、可选属性、构造器改变常量属性值

class TestClass2

{

    var temperatureInCelsius:
Double = 0.0;

    var response:
String?;//可选属性,默认初始化为nil

    let text: String;

    init(fromKelvin kelvin:
Double)//带外部参数名

    {

        temperatureInCelsius = kelvin -
273.15;

        self.text =
"tst";//构造器内部可以初始化let常量属性,改变常量值

    }

    init(_ celsius:
Double)//不带外部参数名

    {

        temperatureInCelsius = celsius;

        self.text =
"tst";//构造器内部可以初始化let常量属性,改变常量值

    }

};

//类的继承和构造过程

class Vehicle

{

    var numOfWheels:Int =
0;

    var description:String

    {

        return
"\(numOfWheels) wheels!";

    }

}

class Bicycle : Vehicle

{

    override
init()

    {

        super.init();

        numOfWheels =
2;

    }

};

var bicycle = Bicycle();

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

//指定构造器:能调用父类Init,不能调用本类的其他init构造器

//便利构造器(convenience):内部可调用其他init构造器,包括父类的init

//指定构造器和便利构造器

class Food

{

    var name:String;

    init(name:String)

    {

        self.name = name;

    }

    convenience
init()

    {

        self.init(name:"[Unnamed]");

    }

}

let namedMeat = Food(name:
"bacon");

let unNamed = Food();

class Milk :
Food//继承父类的所有指定构造器和便利构造器

{

    var quantity :
Int;

    init(name:String,quantity:Int)

    {

        self.quantity = quantity;

        super.init(name: name);

    }

    override
convenience init(name:String)

    {

        self.init(name:name,quantity:1);

    }

}

let milkQuantity =
Milk(name:"[milk]",quantity:
2);

milkQuantity.name;

milkQuantity.quantity;

//可失败构造器

class Car

{

    let name:String;

    init?(name:String)

    {

        self.name = name;

        if(name.isEmpty)

        {

            

            return
nil;

        }

    }

}

let testCar = Car(name:"");//nil

class Product

{

    let name:
String!;//name
属性有个默认值 nil

    init?(name: String)

    {

        self.name = name;

        if name.isEmpty {
return nil; }

    }

}

let product = Product(name:"");

product?.name;

//可失败构造器 init!()

//必要构造器:require,所有子类必须重写该构造器

class SomeClass

{

    required
init()

    {

       
// 在这里添加该必要构造器的实现代码 

    }

}

class SomeSubclass:
SomeClass

{

    required
init()//不需要override

    {

       
// 在这里添加子类必要构造器的实现代码 

    }

}

//通过闭包和函数来设置属性值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: