簡體   English   中英

你能用抽象類來構造泛型嗎?

[英]Can you use an abstract class to construct a generic?

我試圖在泛型上使用構造函數,但由於泛型(這里用 T 表示)可以是任何我試圖讓 T 成為“RedClass”類型的東西。 如果我然后傳遞一個類來表示也擴展了“RedClass”的 T,我將能夠在 T 上使用 RedClass 構造函數,對嗎?

abstract class RedClass {
  RedClass();

  RedClass.fromJson(Map<String, dynamic> json)
}

class BlueClass extends RedClass {
  BlueClass();
}

class FinalClass<T extends RedClass> {

// Inside FinalClass I can create a BlueClass from the generic T

final happyBlueClass = T.fromJson(someJson)

}

// When creating the FinalClass i pass a class that also extends RedClass
return FinalClass<BlueClass>()

但是嘗試這個通用 T 似乎無法訪問任何 .fromJson() 構造函數。 有任何想法嗎?

謝謝大家的建議。 對此,我真的非常感激。

我現在的解決方案是使 FinalClass 的 T 盡可能通用,我需要使用小部件樹中較早的提供程序將構造函數傳遞給 FinalClass。

class FinalClassDataBuilder {
 final Type model;
 final Function builder;

 FinalClassDataBuilder({this.model, this.builder});
}

class FinalClassProvider extends StatelessWidget {
 final Widget child;
 final List<FinalClassDataBuilder> modelbuilderList;

 const FinalClassProvider({Key key, this.child, this.modelbuilderList})
  : super(key: key);

 @override
 Widget build(BuildContext context) {
  return Provider<List<FinalClassDataBuilder>>(
   create: (_) => [...modelbuilderList],
   child: child,
  );
 }
}

class FinalClass<T> {
 ...
 final List<FinalClassDataBuilder> builders =
    Provider.of<List<FinalClassDataBuilder>>(context);

final List<<FinalClassDataBuilder>> result = builders
    .where((datamodel) => datamodel.model.toString() == T.toString())
    .toList();
}

沒有辦法直接做你想做的事情。

你不能在類型變量上調用靜態方法,只能在它們實際聲明的類/混合/擴展上調用。靜態方法需要在編譯時靜態地知道,以便被調用。

如果要創建類型變量的實例,則需要向類傳遞這樣做的方法。 也許:

class FinalClass<T extends RedClass> {
  final T Function(dynamic) _fromJson;

  FinalClass(T Function(dynamic) fromJson) : _fromJson = fromJson;
  void someMethod(someJson) {
    ... 
    var happyBlueClass = _fromJson(someJson);
    ...
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM