3

シナリオ: x個のクラスがあります。10としましょう。各クラスは異なるUI関数を実行します。ユーザーがファイルをロードすると、その拡張子はプログラムにロードするクラス名を指示します。しかし、それは文字列の形式です。

とにかく文字列をクラス名として渡す方法はありますか?の効果への何か。

 var classname = "Booger";

 var nose = new classname(){ //classname really means "Booger"
 //Do Operation
 }
4

2 に答える 2

4

を使用して名前でタイプを反映できますがvar t = Type.from_name(classname);、これは列挙型や構造体を含むすべてのType.INVALIDタイプで機能し、タイプである可能性があります。おそらく、のようないくつかのチェックを行う必要がありますt.is_a(typeof(MyParentClass))

次に、を使用してコピーをインスタンス化できますvar obj = Object.new(t);。全体は次のようになります。

var classname = "Booger";
var t = Type.from_name(classname);
if (t.is_a(typeof(MyParentClass)))
  return Object.new(t);
else
  return null;

また、実行時型名の前に名前空間が付加されていることにも注意してください。そのため、を実行することをお勧めします"MyNs" + classname。生成されたCまたはを実行してチェックインできますtypeof(MyClass).name()

于 2013-01-08T14:25:59.300 に答える
1

nullに対するアサーションエラーの取得に関して、OPと同じ問題が発生しました。Glibのドキュメント(C)を見ると、クラス名の文字列表現を実際に使用する前に、最初にクラス名を実際に指定してクラスを登録する必要があると記載されています。

つまり、Glib.Type.from_name( "ClassName")を使用してクラスのコピーをインスタンス化する前に、まずクラスを使用する必要があります。

クラスインスタンスをインスタンス化するか、クラスの型情報を取得することで、最初にクラスを使用できます。

var type = typeof (MyClass);
var type_from_string = Type.from_name ("MyClass");

さらに、Object.newを使用してクラスを作成する場合、次の2つの点に注意する必要があります。

1)特定のクラスまたは基本クラスを取得するには、戻り値をキャストする必要があります。

var instance_of_my_class = Object.new (type) as MyClass;

2)クラスのコンストラクターは呼び出されなくなります(理由はわかりません)。クラス内でGObjectスタイルコンストラクターを使用する必要があります。

construct {
    pizza = 5;
}
于 2013-05-12T08:08:48.847 に答える