在面向对象编程开发的时候常用的两个思想即继承与多态,最近学到这块,就整理一下,有心人一起学习,另附我学习swift时候常用的两个网站如下:
文档
视频
- 定义基类
class A
{
}
- 定义子类 B
class B : A
{
var name:String
init(name:String) {
self.name = name
}
func printName()
{
print("B对象的name: " + self.name)
}
}
- 定义子类 C
class C : A
{
var name:String
init(name:String) {
self.name = name
}
func printName()
{
print("C对象的name: " + self.name)
}
}
- 定义方法,获取A对象
// 注意返回类型是A类型
func getObject(param:Int) -> A
{
if param > 10 {
return B(name: "小B")
} else {
return C(name: "小C")
}
}
对象的相等性判断
var fyObj = getObject(param: 5) // 本句相当于 var obj:A = getObject(param: 5)
if fyObj is B
{
let p = fyObj as! B
p.printName()
}
if fyObj is C {
let p = fyObj as! C
p.printName()
}
swift提供了方便的可选项绑定
var obj:A = getObject(param: 15)
// 可选项绑定
if let p = obj as? B {
p.printName()
}else if let p1 = obj as? C {
p1.printName()
}
swift中的扩展:extension
// 扩展
extension A
{
var age:Int
{
return 1
}
// 计算属性,以上写法默认get 方法,并且代表只读,强行set 会出现变异错误:Cannot assign to property: 'age' is a get-only property,以上代码相当于
// var age1:Int
// {
// get
// {
// return 1
// }
// }
func toString(param:Int) -> String
{
// self.age = param // Cannot assign to property: 'age' is a get-only property
let str = String(param)
return str
}
/** 同时也可以扩展类型方法(其实就是OC中常说的类方法),另:
static 自带final 属性,是不可被重写的
class 也可用于声明类型方法,允许子类重写
所以static 相当于 final class
*/
static func toString()
{
print(type(of: self))
}
}
var a = A()
print(a.age) // 1
print(a.toString(param: 5)) // 5
A.toString() // A.Type
重写
class D: C {
var nickName: String = "Hi😄我是D "
override var description: String{
return nickName + super.description
}
override func printName() {
print("D 对象的nickName为:\(nickName)" + name)
}
// 重写属性观察器,如果name重新设置,则会调用printName方法
override var name: String{
didSet
{
printName()
}
}
}
var d = D(name: "d")
print(d.description) // 打印:Hi😄我是D hello,我是C
d.printName() // 打印:D 对象的nickName为:Hi😄我是D d
d.name = "我还是D,只是我长大了" // 打印:D 对象的nickName为:Hi😄我是D 我还是D,只是我长大了
在学习的过程中,我只是对觉着需要整理的地方做整理,以便以后自己能够做到有的放矢,同时也能方便他人能够在短时间内学习到重点的知识点,向原创致敬
网友评论