1

クラスがあります

    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」にアクセスする方法 (静的では使用できないため) で、「this.new()」または「new Account()」と同等の何かを言うことができます;" 例: 「新しい this();」そのため、Stuff 内に「newObject」関数を 1 つしか持つことができないか、まったく必要ないかもしれません。

だから今私のコードはこのようになります

    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(); のようなことをする方法を教えてください。または new this(); 明らかに、拡張された「スタッフ」ではなく、クラス「アカウント」にアクセスする必要があります

「this」アプローチが不可能な場合は、既存のオブジェクト内からクラスにアクセスする方法を教えてください。

お気に入り

    generateObjectsFromExisting(names)
      {
        List list = new List();
        var class = this.class;
        var newObject = class.new():
        ...          
      }

または私の現在のアプローチが唯一の解決策です。..希望しない:)

ありがとうございました

4

1 に答える 1

2

現時点で考えられる方法は2つあります。しかし、どちらもリフレクションを使用しているため、どちらも最初のソリューションにかなり近い..

非静的ソリューション:

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その属性を付けるつもりだったかどうかはわかりません。AccountStuff

「クラス」の質問にも答えます。Dart にはクラスはありませTypeん。それを取得するためにできることは次のとおりです。

Type type1 = Account;
Type type2 = account.runtimeType;

しかし、Type には、新しいインスタンスを作成するために使用できるメソッドがありません。

于 2013-11-12T20:27:38.160 に答える