复习:自定义集合
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 75 课,共 110 课。
挑战
简单让我们来构建一个 ScoreBoard 系统,用来跟踪玩家得分,并展示特殊方法如何协同工作,打造完善、专业的类!
你要把代码组织到两个文件中:
score_board.dart:创建一个Player类和一个ScoreBoard类,让它们协同管理游戏得分。你的
Player类应包含name(String)和score(int)。它需要:- 实现
Comparable<Player>,这样就能按得分降序排列玩家(得分最高的排在最前面) - 重写
==和hashCode,让名字相同的两个玩家被视为相等(无论得分如何) - 重写
toString(),返回:[name]: [score] points
你的
ScoreBoard类应存储玩家列表,并提供:- 一个
addPlayer(Player player)方法,仅当玩家尚不存在时才添加该玩家(使用你实现的相等判断!) - 一个不接收参数的
call()方法,返回玩家列表的排序副本(按得分排序,得分最高的排在最前面) - 重写
toString(),显示所有玩家(不排序),每行一位玩家,并在第一行显示标题ScoreBoard:
- 实现
main.dart:导入记分板文件,并展示这些特殊方法如何协同工作:- 创建一个
ScoreBoard - 添加以下玩家:
Alice的得分为150,Bob的得分为200,Charlie的得分为175 - 尝试再次添加得分为
999的Alice(应将其作为重复项拒绝) - 使用它的
toString()打印记分板 - 打印一个空行
- 打印
Rankings: - 像调用函数一样调用记分板来获取排序后的排名,然后打印每位玩家
- 创建一个
这个挑战综合运用了用于显示内容的 toString()、用于检测重复项的 == 和 hashCode、用于排序的 compareTo(),以及用于提供简洁可调用接口的 call()!
预期输出:
ScoreBoard:
Alice: 150 points
Bob: 200 points
Charlie: 175 points
Rankings:
Bob: 200 points
Charlie: 175 points
Alice: 150 points亲手试试
import 'score_board.dart';
void main() {
// TODO: 创建一个 ScoreBoard
// TODO: 添加玩家:Alice(150)、Bob(200)、Charlie(175)
// TODO: 尝试再次添加 Alice,分数为 999(应因重复而被拒绝)
// TODO: 使用记分板的 toString() 打印记分板
// TODO: 打印一个空行
// TODO: 打印 "Rankings:"
// TODO: 像调用函数一样调用记分板,获取排序后的排名,然后打印每位玩家
}
面向对象编程中的所有课
自己练习: Dart 在线编译器