考虑到有的同学没有 iPhone,但学习 Swift 语言大家至少都会有 OS X 操作系统,我们的代码演示都会在 OS X 下完成,使用 CLI 界面。这样虽然又显得古老了,但相信我去掉 GUI 会让你省心不少——因为那又是另一回事了。
那么现在,让我们来和 OOP 问个好
我们来看看,用 OOP 进行开发到底会是个什么样子?
考虑到我们现在并没有很高的开发水平,那么我们把所有的功能实现走用输出文字代替,仅仅来演示“开发”这个过程本身。
老板出现了
“我们这次要做一款手机!”
好吧,我们来开发一个手机:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class CellPhone { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } } |
你看,我们的手机系统有四个方法可以使用?
“我们的二代产品要能够上网!”
好吧,我们再开发一个手机出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class CellPhoneG2 { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } func internet() { print("Hello world!") } } |
“我们的三代产品要有 Wifi !”
好吧,毕竟老板是给你钱的人,我们再来一次吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class CellPhoneG3 { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } func internet() { print("Hello world!") } func wifi() { print("free wifi~") } } |
“你可以回家了。”
好吧,以上三个手机的代码无论给谁看了都会揪心——冗余的部分太多了——我们做了那么多的无用功!难怪会以和老板争吵薪水最终被炒为结局。
这时候只听天空 Duang 的一声,OOP 驾到,让我们来看看面向对象是如何救场的:
抽象父类
我们说手机三代都有开机关机打电话和发短信的功能,那我们就开发一个类,把它们抽象出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class CellPhone { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } } |
“你这样做然并卵!”(老板你别急)
有了这个基础,我们从 CellPhone 继承子类,每一个子类都有父类的全部功能,我们只要再加上额外的功能就好了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class G1:CellPhone { } class G2:CellPhone { func internet() { print("Hello world!") } } class G3:CellPhone { func internet() { print("Hello world!") } func wifi() { print("free wifi~") } } |
看吧?这样就节省了大量的重复开发时间!
“别高兴的太早,我还要开发平板电脑!”
我们都知道其实平板电脑就是个大号的手机,那么我们只需要增加平板电脑的功能在手机上就好了,硬件换一下就 ok~
“我可不想让平板电脑代替了手机的位置,它们能上网但不能打电话和发短信!”
好吧,我们把打电话和发短信的功能重写一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class GPad:CellPhone { override func call() { print("Can not Call!") } override func sendMessage() { print("Can not Send!") } func GPadModel() { print("Im not CellPhone!") } } |
好了,现在平板电脑诞生了。
“哼,我要全部的设备都能开机带声音!”(老板你这是斗气啊~~)
不过没有关系,不要撸起袖子准备大干一场——重构整个系统是不必要的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class CellPhone { func call() { print("Call someone!") } func powerUp () { print("play music~") print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } } |
好了,我们只要更改了父类的开机方法,所有子类就都有了这个功能。
总结
好吧,整体来说我们这个栗子不是很恰当,但并不妨碍我们领会 OOP 的内涵不是吗?通过继承和重写等 OOP 的机制,我们可以很快速的基于以前的基础搭建上层建筑。而且有类型的规定,我们也可以很方便的修改以前的代码而不必影响到后续的代码。
尤其是在多人合作开发的时候,OOP 更是拯救了程序猿的生命,我们可以更加方便的使用别人已经开发写好的轮子(库),可以在某某不在的时候也可以继续开发。
不过,类和对象到底是什么呢?继承究竟是怎么运行的呢?我们下节课再来了解。
本文由 落格博客 原创撰写:落格博客 » 我们的实验环境以及初见 OOP
转载请保留出处和原文链接:https://www.logcg.com/archives/1107.html
通俗易懂