digitalmars.D.learn - Object.factory create instance failed?
- Sam Hu (44/44) Jun 25 2009 The Dmd2.030 spec. said:
- Sam Hu (3/63) Jun 25 2009 BTW,why __traits has no isStaticFunction?
- John C (2/23) Jun 25 2009 Object.factory requires a fully qualified class name, so if class Dog re...
- Sam Hu (3/4) Jun 25 2009 It works now.Great!Thanks so much!
- Ary Borenszweig (2/9) Jun 25 2009 There: http://d.puremagic.com/issues/show_bug.cgi?id=3093
- Sam Hu (3/13) Jun 25 2009 Thanks a lot.
- John C (2/10) Jun 26 2009 Common sense, to be honest.
The Dmd2.030 spec. said:
static Object factory(string classname);
Create instance of class specified by classname. The class must either have no
constructors or have a default constructor.
and said also:
class ClassInfo
static ClassInfo find(in char[] classname);
Search all modules for ClassInfo corresponding to classname.
Returns:
null if not found
Object create();
Create instance of Object represented by 'this'.
In below code snippet:
class Dog
{
public void bark(){}
}
int main(string[] args)
{
auto obj=Object.factory("Dog");
Dog doggie=cast(Dog)obj;
doggie.bark;
return 0;
}
Compiled successfully but failed when run:
Object.Error:Access Violation.
I also tried ClassInfo.find(string classname),ClassInfo.create() but caused the
same error.
In the above code snippet,if I wrote as below:
class Dog{...}
int main(string[] args)
{
Object obj=Object.factory("Dog");
obj=new Dog; //1
Dog doggie=cast(Dog)obj;//2
doggie.bark;
return 0;
}
Everything works fine.But it seems that this does not make sense to dynamic
create class instance.It is just the same as below:
Object obj;
obj=new Dog;
(cast(Dog)obj).bark;
So is there any other options can I reach the goal,i.e.,dynamically create an
class instance and invoke its method?
Thanks in advance.
Regards,
Sam
Jun 25 2009
Sam Hu Wrote:
The Dmd2.030 spec. said:
static Object factory(string classname);
Create instance of class specified by classname. The class must either have no
constructors or have a default constructor.
and said also:
class ClassInfo
static ClassInfo find(in char[] classname);
Search all modules for ClassInfo corresponding to classname.
Returns:
null if not found
Object create();
Create instance of Object represented by 'this'.
In below code snippet:
class Dog
{
public void bark(){}
}
int main(string[] args)
{
auto obj=Object.factory("Dog");
Dog doggie=cast(Dog)obj;
doggie.bark;
return 0;
}
Compiled successfully but failed when run:
Object.Error:Access Violation.
I also tried ClassInfo.find(string classname),ClassInfo.create() but caused
the same error.
In the above code snippet,if I wrote as below:
class Dog{...}
int main(string[] args)
{
Object obj=Object.factory("Dog");
obj=new Dog; //1
Dog doggie=cast(Dog)obj;//2
doggie.bark;
return 0;
}
Everything works fine.But it seems that this does not make sense to dynamic
create class instance.It is just the same as below:
Object obj;
obj=new Dog;
(cast(Dog)obj).bark;
So is there any other options can I reach the goal,i.e.,dynamically create an
class instance and invoke its method?
Thanks in advance.
Regards,
Sam
BTW,why __traits has no isStaticFunction?
Thanks in advance.
Jun 25 2009
Sam Hu Wrote:
In below code snippet:
class Dog
{
public void bark(){}
}
int main(string[] args)
{
auto obj=Object.factory("Dog");
Dog doggie=cast(Dog)obj;
doggie.bark;
return 0;
}
Compiled successfully but failed when run:
Object.Error:Access Violation.
I also tried ClassInfo.find(string classname),ClassInfo.create() but caused
the same error.
Object.factory requires a fully qualified class name, so if class Dog resides
in module animals, call Object.factory("animals.Dog").
Jun 25 2009
John C Wrote:
Object.factory requires a fully qualified class name, so if class Dog resides
in module animals, call Object.factory("animals.Dog").
It works now.Great!Thanks so much!
But...may I ask how do you know that?(requires full name).I went through the
object.di but nothing relative found.
Jun 25 2009
Sam Hu escribió:John C Wrote:There: http://d.puremagic.com/issues/show_bug.cgi?id=3093Object.factory requires a fully qualified class name, so if class Dog resides in module animals, call Object.factory("animals.Dog").It works now.Great!Thanks so much! But...may I ask how do you know that?(requires full name).I went through the object.di but nothing relative found.
Jun 25 2009
Ary Borenszweig Wrote:Sam Hu escribi?Thanks a lot. I found the reflection(object module + __traits) of the current version of D2 is very powerful already .Wondering how come some ppl here felt that D is still lack of reflection?John C Wrote:There: http://d.puremagic.com/issues/show_bug.cgi?id=3093Object.factory requires a fully qualified class name, so if class Dog resides in module animals, call Object.factory("animals.Dog").It works now.Great!Thanks so much! But...may I ask how do you know that?(requires full name).I went through the object.di but nothing relative found.
Jun 25 2009
Sam Hu Wrote:John C Wrote:Common sense, to be honest.Object.factory requires a fully qualified class name, so if class Dog resides in module animals, call Object.factory("animals.Dog").It works now.Great!Thanks so much! But...may I ask how do you know that?(requires full name).I went through the object.di but nothing relative found.
Jun 26 2009









Sam Hu <samhudotsamhu gmail.com> 