【问题标题】:Dart: how to override a generic method?Dart:如何覆盖泛型方法?
【发布时间】: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&lt;T&gt; getUsers&lt;T extends IUser&gt;() =&gt; members; 引发错误,因为我返回 List&lt;ChatUser&gt; 而不是 List&lt;T&gt;。如何覆盖该方法以使其正常工作?我的ChatUser 类显然也扩展了IUser

编辑

@jamesdlin 给出了一种解决方案:@override List&lt;T&gt; getUsers&lt;T extends IUser&gt;() =&gt; members.cast&lt;T&gt;()。不用类型转换也可以吗?

【问题讨论】:

  • 您应该能够在通用函数中使用您的类型,即:List&lt;ChatUser&gt; getUsers&lt;ChatUser&gt;() =&gt; members;
  • @Mattia 感谢您的回复。可悲的是,这也会引发错误:'Chat.getUsers' ('List&lt;ChatUser&gt; Function&lt;ChatUser&gt;()') isn't a valid override of 'IChat.getUsers' ('List&lt;T&gt; Function&lt;T extends IUser&gt;()').
  • 我不知道是否有更好的方法,但@override List&lt;T&gt; getUsers&lt;T extends IUser&gt;() =&gt; members.cast&lt;T&gt;(); 有效。
  • @jamesdlin 很好,谢谢。但是没有类型转换就没有办法了吗?

标签: dart generic-list


【解决方案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,所以我还有很多东西要学!
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多