【问题标题】:How to implement generic class spezialization in Dart如何在 Dart 中实现泛型类专业化
【发布时间】:2020-06-28 19:25:44
【问题描述】:

在 Dart 中我们可以使用泛型类 [class]。我们也可以专门化那些类 [class]。但是在运行时不使用专业化。 (在 C++ 中,这称为模板编程)

示例:以下代码将导致输出

你好世界 你好吗

class MyClass<T> {
  foo( print('Hallo world'); );
}

class MyClassInt implements MyClass<int> {
  @override
  foo( print('How are you'); );
}

main() {
  MyClass<int> a = Myclass<int>();
  MyClassInt b = MyClassInt();

  a.foo();
  b.foo();
}

如何进行特化(此处为 [int] 类型),即在运行时调用它,即

main() {
  MyClass<int> a = Myclass<int>();

  a.foo();
}

应该导致结果“你好吗”。

【问题讨论】:

  • Dart 泛型不支持特化。

标签: dart generic-programming specialization


【解决方案1】:

正如 jamesdlin 所说,Dart 不支持专业化。但是你可以做这样的事情来制造错觉:

class MyClass<T> {
  factory MyClass() {
    if (T == int) {
      return MyClassInt() as MyClass<T>;
    } else {
      return MyClass._();
    }
  }

  // Hidden real constructor for MyClass
  MyClass._();

  void foo() {
    print('Hallo world');
  }
}

class MyClassInt implements MyClass<int> {
  @override
  void foo() {
    print('How are you');
  }
}

void main() {
  final a = MyClass<int>();
  final b = MyClassInt();
  final c = MyClass<String>();

  a.foo(); // How are you
  b.foo(); // How are you
  c.foo(); // Hallo world
}

【讨论】:

  • 亲爱的,感谢您的回答。使用开关让我很尴尬。那时我将不得不寻找替代设计。但是,确实,在那种情况下,允许没有专门化的泛型类似乎是一个非常有限的实现,它没有达到功能的大部分好处。
  • 这并不是我真正经历过的限制,但可能是因为我主要使用 Java 和 Dart 进行开发,我太“盲目”地看不到这个功能的用处。通常,如果您正在创建一个泛型类,您可以对其进行编码,使其适用于您需要的所有类型,而无需额外的类。或者,您可以编写特定类型的类并使用mixin 从共享的公共类中获取共享功能。好吧,如果有极端情况,您可以按照我的示例中的少数情况进行操作。但也许你可以举一个例子来说明 Dart 需要这个功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2015-03-06
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多