Dart: ジェネリック、ジェネリック インターフェイス、ジェネリック メソッド

ヒント: 記事を書いた後、目次を自動生成することができます. 生成方法は右のヘルプドキュメントを参照してください.


序文

この記事では、Dart の一般的な関連知識ポイントを整理します

Dart でジェネリックを学習する前に、ジェネリックが解決する次の 2 つの主な問題をまず理解してください。

  • 同じメソッド ロジックで異なるデータ ロジックが原因で発生する冗長性の問題
  • 開発の初期段階でデータ型が変更されるかどうかを判断できない場合に採用される戦略

1.一般的な方法

以下は、ジェネリック メソッドを使用して異なる int 型と String 型を返すというコードの冗長性の問題を解決する方法を示しています。

String getData1(String value){
    
    
      return value;
  }

  int getData2(int value){
    
    
      return value;
  }

型を指定しないことで上記の問題を解決できますが、これにより型チェックが放棄されます。

getData(value){
    
    
      return value;
  }

異なる戻り値の型によって引き起こされるコードの冗長性の問題を解決し、同時に型チェックを実行するには、ジェネリックを使用できます。

T getData<T>(T value){
    
    
      return value;
  }

void main(){
    
    

    print(getData(21));

    print(getData('xxx'));

    getData<String>('你好');

    print(getData<int>(12));

}

2.ジェネリッククラス

コレクション リスト ジェネリック クラスの使用法

ケース: 次のクラスをジェネリック クラスに変換し、List に int 型のデータを追加できること、および String 型のデータも追加できることを要求します。ただし、呼び出しごとに追加されるタイプは統一する必要があります

デモコードは以下の通り

class PrintClass<T>{
    
    
      List list=new List<T>();
      void add(T value){
    
    
          this.list.add(value);
      }
      void printInfo(){
    
              
          for(var i=0;i<this.list.length;i++){
    
    
            print(this.list[i]);
          }
      }
 }

main() {
    
      
    PrintClass p=new PrintClass();
    p.add(11);
    p.add(5);
    p.printInfo();

  PrintClass p=new PrintClass<String>();

  p.add('你好');
  p.add('哈哈');
  p.printInfo();

  PrintClass p=new PrintClass<int>();

  p.add(12);
  p.add(23);
  p.printInfo();

  List list=new List();
  list.add(12);
  list.add("你好");
  print(list);

  List list=new List<String>();

  // list.add(12);  //错误的写法

  list.add('你好');
  list.add('你好1');

  print(list);

  List list=new List<int>();

  // list.add("你好");  //错误写法
  list.add(12); 

  print(list);
}

3. 汎用インターフェース

データ キャッシングの機能を実現します。ファイル キャッシングとメモリ キャッシングがあります。メモリ キャッシュとファイル キャッシュは、インターフェイスの制約に従って実装されます。

  • サブクラスを実装するジェネリック インターフェイス制約を定義するには、getByKey(key) と setByKey(key,value) が必要です。

  • setByKey を要求するときの値の型は、サブクラスをインスタンス化するときに指定された型と一致しています

  abstract class ObjectCache {
    
    
    getByKey(String key);
    void setByKey(String key, Object value);
  }

  abstract class StringCache {
    
    
    getByKey(String key);
    void setByKey(String key, String value);
  }

  abstract class Cache<T> {
    
    
    getByKey(String key);
    void setByKey(String key, T value);
  }

class FlieCache<T> implements Cache<T>{
    
    
  
  getByKey(String key) {
    
        
    return null;
  }

  
  void setByKey(String key, T value) {
    
    
   print("我是文件缓存 把key=${
      
      key}  value=${
      
      value}的数据写入到了文件中");
  }
}

class MemoryCache<T> implements Cache<T>{
    
    
  
  getByKey(String key) {
    
       
    return null;
  }

  
  void setByKey(String key, T value) {
    
    
       print("我是内存缓存 把key=${
      
      key}  value=${
      
      value} -写入到了内存中");
  }
}
void main(){
    
    

    MemoryCache m=new MemoryCache<String>();
     m.setByKey('index', '首页数据');

     MemoryCache m=new MemoryCache<Map>();
     m.setByKey('index', {
    
    "name":"张三","age":20});
}

おすすめ

転載: blog.csdn.net/qjyws/article/details/128816899