2017-03-08 123 views
1

解析器抱怨屬性繼承器.list不是ModelList.list的子類型,但LeadsGroup確實從Model繼承。 這是錯誤的嗎?什麼是正確的方法來做到這一點?列表屬性繼承

我的基類:

abstract class ModelList { 
    List<Model> get list; 
    set list(List<Model> n); 
} 

繼承人:

class ListLeadsGroup extends ModelList { 
    List<LeadsGroup> list; 
} 

class LeadsGroup extends Model { 
} 

回答

0

發現使用new關鍵字covariant的解決方案。現在,擴展ModelList的類可以覆蓋沒有警告的List<Model>列表。

@serializable 
abstract class ModelList extends ModifiedModel 
     implements Model { 
    Type get listType { 
     throw new UnimplementedError(); 
    } 

    List<Model> get list; 
    set list(covariant List n); 
} 
0

如果你有這樣的代碼

class Foo extends ModelList {} 

ModelList ml = new ListLeadsGroup(); 
ml.list.add(new Foo()); 

ml.listModel型的,因此增加Foo應該是合法的。 但這很可能不是你想要的。
這就是爲什麼List<ListLeadsGroup>無法覆蓋List<Model>

這應該做你想要什麼:

abstract class ModelList<T extends Model> { 
    List<T> get list; 
    set list(List<T> n); 
} 

class ListLeadsGroup extends ModelList<LeadsGroup> { 
    List<LeadsGroup> list; 
} 

class LeadsGroup extends Model { 
} 

從馬灘Lurey的評論只是複製上的Gitter

import 'package:func/func.dart'; 

class ModelRegistry { 
    final _factories = <Type, Func0<Model>>{}; 

    Model create(Type type) => _factories[type](); 

    void register(Type type, Model factory()) { 
    _factories[type] = factory; 
    } 
} 

main() { 
    var registry = new ModelRegistry(); 
    registry.register(FooModel,() => new FooModel()); 
    var foo = registry.create(FooModel); 
} 
+0

不幸的是,這個問題是我不能使用可反射產生ModelList的動態實例沒有找到牛逼 – Jonathan

+0

喜岡特的runtimeType,我將能夠使用可反射和這個?我認爲這種邏輯會導致我長期創建另一個可反映的系統 – Jonathan

+0

不確定你想要做什麼反映。瀏覽器應用程序也不鼓勵使用反射,Flutter根本不支持反射。 –