у меня есть класс
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()' находится в объекте учетной записи, а не в учетной записи
2 Мне приходится вручную добавлять метод "newObject" в каждый класс, который я реализую.
Я бы предпочел статический метод, такой как «Account.generateObjectsFromExisting()», но как получить доступ к «этому» (поскольку он недоступен в статике), поэтому я могу сказать «this.new()» или что-то эквивалентное «новой учетной записи()» ;" например, "новый это();" и поэтому иметь возможность иметь только одну функцию «newObject» внутри Stuff или, возможно, вообще не нуждаться в ней.
так что теперь мой код будет выглядеть так
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
}
если вы можете показать мне способ доступа к классу, чтобы сделать что-то вроде this.new(); или новое это(); тогда, очевидно, необходимо получить доступ к классу «Учетная запись», а не к расширенному «Материалу».
если «этот» подход невозможен, то, возможно, вы можете показать мне способ доступа к классу из уже существующего объекта
подобно
generateObjectsFromExisting(names)
{
List list = new List();
var class = this.class;
var newObject = class.new():
...
}
или мой текущий подход - единственное решение. .. надеюсь нет :)
Спасибо