Dart:如何覆盖泛型方法?
Posted
技术标签:
【中文标题】Dart:如何覆盖泛型方法?【英文标题】:Dart: how to override a generic method? 【发布时间】:2020-12-06 16:52:21 【问题描述】:考虑我的以下基类:
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;
引发错误,因为我返回 List<ChatUser>
而不是 List<T>
。如何覆盖该方法以使其正常工作?我的ChatUser
类显然也扩展了IUser
。
编辑
@jamesdlin 给出了一种解决方案:@override List<T> getUsers<T extends IUser>() => members.cast<T>()
。不用类型转换也可以吗?
【问题讨论】:
您应该能够在通用函数中使用您的类型,即:List<ChatUser> getUsers<ChatUser>() => members;
@Mattia 感谢您的回复。可悲的是,这也会引发错误:'Chat.getUsers' ('List<ChatUser> Function<ChatUser>()') isn't a valid override of 'IChat.getUsers' ('List<T> Function<T extends IUser>()').
我不知道是否有更好的方法,但@override List<T> getUsers<T extends IUser>() => members.cast<T>();
有效。
@jamesdlin 很好,谢谢。但是没有类型转换就没有办法了吗?
【参考方案1】:
首先考虑你真正想要你的班级做什么。
似乎子类有一个特定类型的IUser
,它总是想要返回,但是一个泛型函数每次调用都会接受它的类型参数。因此,类型可能应该是类的属性,而不是调用的属性。
考虑:
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;
这能满足你的需求吗?
作为风格的 cmets,您的代码非常类似于 C#,并且看起来不像 Dart。我可能会将这些类声明为:
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;
// ...
【讨论】:
这太棒了,正是我想要的!非常感谢!也感谢你的风格评论,我什至不知道这是一种可能性。我在 2 个月前开始使用 Dart,所以我还有很多东西要学!以上是关于Dart:如何覆盖泛型方法?的主要内容,如果未能解决你的问题,请参考以下文章