【问题标题】:How to set type definitions depending on the extending class in dartlang如何根据 dartlang 中的扩展类设置类型定义
【发布时间】:2020-10-28 20:33:15
【问题描述】:

有没有办法像在 PHP 中使用 static::class 那样将方法的返回类型或对象前缀声明为“extendingClass”?

例如:

abstract class AbstractModel {

  // Should return the database-provider for the given model
  dynamic get modelProvider;

  // Save instance to Database - Create new if no ID exists, 
  // else update existing
  dynamic save() {
    if( id == null ) {
      modelProvider.insert(this); 
    } else {
      modelProvider.update(this);
    }
    return this;
  }
}

class ToDo extends AbstractModel {
  ToDoProvider get modelProvider {
    return ToDoProvider;
  }
}

所以在这个例子中,显然AbstractModel 还不知道modelProvider 的返回类型是什么,但我知道它对于给定的孩子总是相同的类型。此外,save 方法的返回类型始终是子类。但是当这样写时,我会收到一个错误,因为用无效的返回类型覆盖modelProvider

由于飞镖类 javascript 的性质,我认为没有办法像在 PHP 中那样实际实现这一点。但后来我想知道如何键入保存构建可重用的代码?我正在尝试为我的模型实现一个像查询方案这样的小雄辩,所以我不必为每个模型编写每个 CRUD 方法 - 但我仍然希望准确了解类型,而不是在任何地方使用 dynamic

那么有没有办法在飞镖中做到这一点,还是我完全偏离了飞镖标准?

【问题讨论】:

    标签: flutter dart inheritance


    【解决方案1】:

    你可以使用泛型:

    abstract class AbstractModel<ChildType extends AbstractModel<ChildType>> {
    
      // Should return the database-provider for the given model
      ModelProvider<ChildType> get modelProvider;
    
      // Save instance to Database - Create new if no ID exists, 
      // else update existing
      ChildType save() {
        if( id == null ) {
          modelProvider.insert(this); 
        } else {
          modelProvider.update(this);
        }
        return this;
      }
    }
    
    class Model extends AbstractModel<Model> {
    }
    
    abstract class ModelProvider<T> {
      void insert(T value);
      void update(T value);
    }
    
    class MyModelProvider extends ModelProvider<Model> {
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2021-07-09
      • 2011-04-20
      • 1970-01-01
      • 2016-02-15
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多