Menu
CoddyTech

复习:自定义集合

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 75 课,共 110 课。

challenge icon

挑战

简单

让我们来构建一个 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 在线编译器