在 Dart 中,我试图扩展一个类,同时更改其属性之一的类型

1 extends class dart flutter

Class1 有一个属性List<ClassA> xyz = [];。ClassA 有许多属性和方法。ClassB 扩展了 ClassA,添加了额外的属性和方法。有没有办法让我创建扩展 Class1 的 Class2 但将 xyz 的 TYPE 更改为List<ClassB>?如果这令人困惑,希望下面的代码能够给出我想要实现的目标的示例。基本上与重写方法相同,但重写属性。

class Game {
  int points;
  String opponent;
  int opponentPoints;
}

class FootballGame extends Game {
  int touchdowns;
  int opponentstouchdowns;
}

class BaseballGame extends Game {
  int homeruns;
  int opponentsHomeruns;
}

class Team {
   String name;
   List<Game> games;

  double winningPercentage() {
    int wins = 0;
    for(var game in games){
      wins += (game.points > game.opponentPoints) ? 1 : 0;        
    }
    return wins / games.length;
  }
}

class FootballTeam extends Team {
  // How do I change the TYPE of the games property to <FootballGame>

}
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 7

在这种情况下您可以使用covariant关键字

class FootballTeam extends Team {
  @override
  covariant List<FootballGame> games;
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这样做可能不安全;需要关键字的原因covariant是为了抑制由于重写可能违反基类的约定而出现的类型错误:基类宣传可以games分配 a List<Game>,但这样的分配对于派生类来说是无效的。通过使用covariant关键字,您可以禁用类型检查并负责确保您在实践中不违反合同。

请注意,如果该games成员是final(或只是一个 getter),那么覆盖(使用更具体的类型)将是安全的,并且不需要使用covariant.

编辑

我忘记了我在为类似问题写更详细的答案时写过这个答案。