我有一个类
class Account extends Stuff{
String name;
newObject(){
return new Account();
}
}
在Stuff类中,我有一个方法
//generates list of objects of the same type
//as given object and fills attribute
generateObjectsFromExisting(names)
{
List list = new List();
InstanceMirror instanceMirror = reflect(this);
Symbol formatSymbol = new Symbol("newObject");
for(var name in names){
//calles newObject function from this and returns a new object
var newInstanceObject = instanceMirror.invoke(formatSymbol, []);
Symbol symbol = new Symbol("name");
InstanceMirror field = newInstanceObject.setField(symbol,name);
list.add(newInstanceObject.reflectee)
}
return list;
}
所以写的时候
main(){
var account = new Account();
List accounts = new List();
accounts = account.generateObjectsFromExisting(['tim','tom']);
print(account.name) // returns null
print(accounts[0].name) // returns tim
print(accounts[1].name) // returns tom
}
这种方式的问题是
1'generateObjectsFromExisting()'在'account'对象上,而不在Account上
2我必须手动将“newObject”方法添加到我实现的每个类中。
我更喜欢静态方法,例如'Account.generateObjectsFromExisting()'
但是如何访问“this”(因为它在静态中不可用)
所以我可以说“this.new()”或等同于“new Account();”的东西例如“new this();”
因此在Stuff中只能有一个'newObject'函数,或者根本不需要它。
所以现在我的代码看起来像这样
class Account extends Stuff{
String name;
}
在东西
static generateObjectsFromExisting(names)
{
List list = new List();
for(var name in names){
var object = new this();
object.name = name;
list.add(object)
}
return list;
}
在主要
main(){
// returns list of Accounts filled with names
accounts = Account.generateObjectsFromExisting(['tim','tom']);
print(accounts[0].name) // returns tim
print(accounts[1].name) // returns tom
}
如果您可以向我展示一种访问Class的方法来执行类似this.new();的操作,或新this();那么显然需要访问“帐户”类,而不是扩展的“内容”
如果无法使用“这种”方法,那么也许您可以向我展示一种如何从现有对象中访问类的方法
喜欢
generateObjectsFromExisting(names)
{
List list = new List();
var class = this.class;
var newObject = class.new():
...
}
还是我当前的方法是唯一的解决方案。 .. 希望不是 :)
谢谢
最佳答案
目前,我可以想到两种方式。但是它们都非常接近您的初始解决方案,因为它们都使用反射。
非静态解决方案:
class Stuff {
generateObjectsFromExisting(List<String> names) {
var cm = reflectClass(this.runtimeType);
return names.map((name) {
var newInstance = cm.newInstance(const Symbol(''), []).reflectee;
newInstance.name = name;
return newInstance;
}).toList();
}
}
静态解决方案:
class Stuff {
static generateObjectsFromExisting(type, List<String> names) {
var cm = reflectClass(type);
return names.map((name) {
var newInstance = cm.newInstance(const Symbol(''), []).reflectee;
newInstance.name = name;
return newInstance;
}).toList();
}
}
您将这样调用静态解决方案:
var accounts = Stuff.generateObjectsFromExisting(Account, ['tim', 'tom']);
可能还有另一种涉及工厂构造函数的解决方案,但现在还没有想到。同样,当您获得另一个没有
Stuff
属性的name
子类时,此代码也很容易中断。我不知道您是否真的打算将该属性放在Account
而不是Stuff
上。还回答您的“类(class)”问题。 Dart中没有类,只有
Type
,要获取它,您可以执行以下操作:Type type1 = Account;
Type type2 = account.runtimeType;
但是Type没有任何可用于创建新实例的方法。
关于dart - 如何动态创建新的类实例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937317/