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&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 很好,谢谢。但是没有类型转换就没有办法了吗? 【参考方案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:如何覆盖泛型方法?的主要内容,如果未能解决你的问题,请参考以下文章

Dart泛型

Dart语言:枚举泛型

覆盖方法中的泛型

Flutter必备语言Dart教程03 - 类,泛型

Java协变式覆盖(Override)和泛型重载(Overload)

如何在 Kotlin 中用继承的类覆盖方法?