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)
在这种情况下您可以使用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.
我忘记了我在为类似问题写更详细的答案时写过这个答案。