上一节课我们第一次领略了 OOP 的风采,于模棱两可的类和对象究竟是什么东西呢?这节课我们用一个简单的小栗子来向你介绍。
尝试解释
我们说类和对象的关系是设计图和产品的关系,就拿我们的房子来说,一栋楼肯定会有对应的设计图,但设计图绝不会只能对应一栋楼,至少一个小区肯定会用一套设计图不是吗?我们的“类”就是这个“设计图”。我们用这个设计图设计了对象的属性、功能等等的一系列内容,然后通过实例化来产生这个类的对象。
比如我们新建了一个“汽车”的类,然后我们就可以实例化出不同的对象了,比如卡车是汽车,轿车也是汽车。
一个猜数字的小程序
我们来用一个具体的小程序像你说明类和对象的区别——一个游戏主体的类,一个猜数字的玩家的类:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
// // GuessGame.swift // test // // Created by R0uter on 15/8/2. // Copyright © 2015年 R0uter. All rights reserved. // import Foundation class GuessGame { var p1 = Player() var p2 = Player() var p3 = Player() // 三个玩家的实例 func startGame() { var guessP1 = 0 var guessP2 = 0 var guessP3 = 0 // 储存玩家猜的数字 var p1IsRight = false var p2IsRight = false var p3IsRight = false // 保存玩家是否猜中 let targetNumber = Int (arc4random_uniform(10)) // 生成一个0到9的随机数 print("生成0 - 9的随机数……") while (true) { print("要猜的数字是 \(targetNumber)") p1.guess() p2.guess() p3.guess() // 让三个玩家进行猜测,分别调用他们的 guess() 方法。 guessP1 = p1.number print("玩家1 猜测数字是 \(guessP1)") guessP2 = p2.number print("玩家2 猜测数字是 \(guessP2)") guessP3 = p3.number print("玩家3 猜测数字是 \(guessP3)") // 取出他们猜测的数字 if ( guessP1 == targetNumber) { p1IsRight = true } if ( guessP2 == targetNumber) { p2IsRight = true } if ( guessP3 == targetNumber) { p3IsRight = true } // 进行判断看他们是否猜对,如果猜对则修改对应玩家的属性 if (p1IsRight || p2IsRight || p3IsRight) { print("结果出来了") print("P1 win? \(p1IsRight)" ) print("P2 win? \(p2IsRight)") print("P3 win? \(p3IsRight)") print("GG") break } else { print("没人猜中,再来一次!") } } } } |
接下来是玩家的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // Player.swift // test // // Created by R0uter on 15/8/2. // Copyright © 2015年 R0uter. All rights reserved. // import Foundation class Player { var number = 0 //猜的数字 func guess() { number = Int (arc4random_uniform(10)) print("\(number) ?") } } |
两个类都搞定了,但是编译程序发现没有任何动静——没关系,因为我们还没有告诉系统程序的入口。
找到 main 文件,我们来吧游戏主体实例化:
1 2 3 4 5 6 |
import Foundation let game = GuessGame() //实例化游戏主体,生成一个游戏的对象 game.startGame() //执行对象中的方法启动游戏 |
这样,运行后就会有大概如下的结果——由于我们产生了随机数,所以每次的执行结果都会完全一样。
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
生成0 - 9的随机数…… 要猜的数字是 9 1 ? 1 ? 3 ? 玩家1 猜测数字是 1 玩家2 猜测数字是 1 玩家3 猜测数字是 3 没人猜中,再来一次! 要猜的数字是 9 4 ? 2 ? 6 ? 玩家1 猜测数字是 4 玩家2 猜测数字是 2 玩家3 猜测数字是 6 没人猜中,再来一次! 要猜的数字是 9 8 ? 3 ? 4 ? 玩家1 猜测数字是 8 玩家2 猜测数字是 3 玩家3 猜测数字是 4 没人猜中,再来一次! 要猜的数字是 9 0 ? 1 ? 3 ? 玩家1 猜测数字是 0 玩家2 猜测数字是 1 玩家3 猜测数字是 3 没人猜中,再来一次! 要猜的数字是 9 0 ? 7 ? 4 ? 玩家1 猜测数字是 0 玩家2 猜测数字是 7 玩家3 猜测数字是 4 没人猜中,再来一次! 要猜的数字是 9 1 ? 7 ? 0 ? 玩家1 猜测数字是 1 玩家2 猜测数字是 7 玩家3 猜测数字是 0 没人猜中,再来一次! 要猜的数字是 9 1 ? 4 ? 4 ? 玩家1 猜测数字是 1 玩家2 猜测数字是 4 玩家3 猜测数字是 4 没人猜中,再来一次! 要猜的数字是 9 4 ? 0 ? 3 ? 玩家1 猜测数字是 4 玩家2 猜测数字是 0 玩家3 猜测数字是 3 没人猜中,再来一次! 要猜的数字是 9 7 ? 7 ? 4 ? 玩家1 猜测数字是 7 玩家2 猜测数字是 7 玩家3 猜测数字是 4 没人猜中,再来一次! 要猜的数字是 9 3 ? 9 ? 6 ? 玩家1 猜测数字是 3 玩家2 猜测数字是 9 玩家3 猜测数字是 6 结果出来了 P1 win? false P2 win? true P3 win? false GG Program ended with exit code: 0 |
总结
你看,我们在 GuessGame 类中实际上生成了3个玩家的对象,但实际上我们都是从同一个类生成,我们把这三个玩家的对象叫做“实例”,它们都是 Player 这个类产生的,但在实际的运行当中,由于它们的属性各自不同,又不会完全一样——这就是对象与类的差别。
课后题
这里有一段被破坏了的代码文件,我们还记录着当时运行输出的结果,现在需要你来把它补齐。
记得每一行只能写一句代码哟~否则就算是作弊了!
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 27 28 29 30 |
import Foundation class //这里丢失一行 { var //这里丢失一行 = 0 func //这里丢失一行 { print("hellooooo.....") } } var e1 = Echo() //这里丢失一行 var x = 0 while //这里丢失一行 { e1.hello() //这里丢失一行 if x == 4(还是 x == 3? 看不清楚了) { e2.count = e2.count + 1 } if x > 0 { e2.count = e2.count + e1.count } x = x + 1 } print(e2.count) |
下面是代码执行后的结果:
1 2 3 4 5 6 |
hellooooo..... hellooooo..... hellooooo..... hellooooo..... 10 Program ended with exit code: 0 |
……对了,如果结果不是10,而是24,那代码又该如何修改呢?
1 2 3 4 5 6 |
hellooooo..... hellooooo..... hellooooo..... hellooooo..... 24 Program ended with exit code: 0 |
本文由 落格博客 原创撰写:落格博客 » 猜数字游戏:类的对象的区别
转载请保留出处和原文链接:https://www.logcg.com/archives/1108.html
import Foundation
class Echo {
var count = 0
func hello() {
print(“hellooooo…..”)
}
}
var e1 = Echo()
var e2 = Echo()
var x = 0
while x < 4 {
e1.hello()
e1.count += x
e2.count = e2.count + e1.count
x += 1
}
print(e2.count)