Dart:如何重写泛型方法?
Dart: how to override a generic method?
考虑我的以下基础 class:
abstract class IChat<Message extends IMessage> {
String get getId;
List<T> getUsers<T extends IUser>();
}
现在我的扩展模型如下所示:
class Chat extends IChat<ChatMessage> {
String id;
List<ChatUser> members;
Chat({this.chat, this.members});
@override
String get getId => id;
@override
List<T> getUsers<T extends IUser>() => members;
}
List<T> getUsers<T extends IUser>() => members;
抛出错误,因为我 return List<ChatUser>
而不是 List<T>
。我如何重写该方法以使其工作?我的 ChatUser
class 显然也扩展了 IUser
.
编辑
@jamesdlin 给出了一种解决方案:@override List<T> getUsers<T extends IUser>() => members.cast<T>()
。没有类型转换是可能的吗?
首先考虑您实际上想要您class要做的事情。
似乎 subclass 有一个特定类型的 IUser
它总是想要 return,但是泛型函数采用它的类型参数 per调用。因此,类型可能应该是 class 的 属性,而不是调用的 属性。
考虑:
abstract class IChat<Message extends IMessage> {
String get getId;
List<IUser> getUsers();
}
class Chat extends IChat<ChatMessage> {
String id;
List<ChatUser> members;
Chat({this.chat, this.members});
@override
String get getId => id;
@override
List<ChatUser> getUsers() => members;
}
这样能满足你的需求吗?
作为风格评论,您的代码很像 C#,看起来不像 Dart。我可能会将 classes 声明为:
abstract class Chat<M extends Message> {
String get id;
List<User> get users;
}
class SomeChat extends Chat<ChatMessage> {
@override
final String id;
@override
List<ChatUser> users;
// ...
SomeChat({this.id, List<CharUser> members, ...}) : users = members;
// ...
}
考虑我的以下基础 class:
abstract class IChat<Message extends IMessage> {
String get getId;
List<T> getUsers<T extends IUser>();
}
现在我的扩展模型如下所示:
class Chat extends IChat<ChatMessage> {
String id;
List<ChatUser> members;
Chat({this.chat, this.members});
@override
String get getId => id;
@override
List<T> getUsers<T extends IUser>() => members;
}
List<T> getUsers<T extends IUser>() => members;
抛出错误,因为我 return List<ChatUser>
而不是 List<T>
。我如何重写该方法以使其工作?我的 ChatUser
class 显然也扩展了 IUser
.
编辑
@jamesdlin 给出了一种解决方案:@override List<T> getUsers<T extends IUser>() => members.cast<T>()
。没有类型转换是可能的吗?
首先考虑您实际上想要您class要做的事情。
似乎 subclass 有一个特定类型的 IUser
它总是想要 return,但是泛型函数采用它的类型参数 per调用。因此,类型可能应该是 class 的 属性,而不是调用的 属性。
考虑:
abstract class IChat<Message extends IMessage> {
String get getId;
List<IUser> getUsers();
}
class Chat extends IChat<ChatMessage> {
String id;
List<ChatUser> members;
Chat({this.chat, this.members});
@override
String get getId => id;
@override
List<ChatUser> getUsers() => members;
}
这样能满足你的需求吗?
作为风格评论,您的代码很像 C#,看起来不像 Dart。我可能会将 classes 声明为:
abstract class Chat<M extends Message> {
String get id;
List<User> get users;
}
class SomeChat extends Chat<ChatMessage> {
@override
final String id;
@override
List<ChatUser> users;
// ...
SomeChat({this.id, List<CharUser> members, ...}) : users = members;
// ...
}