J'ai remarqué la fonction Object.factory (char [] className) dans D. Mais cela ne fonctionne pas comme si j'espérais que cela fonctionnerait; il ne fonctionne pas;)Obtenir l'instance de classe par la chaîne de nom de classe
Un exemple:
import std.stdio;
class TestClass
{
override string toString()
{
return typeof(this).stringof; // TestClass
}
};
void main(string[] args)
{
auto i = Object.factory("TestClass");
if (i is null)
{
writeln("Class not found");
}
else
{
writeln("Class string: " ~ i);
}
}
Je pense que cela devrait se traduire par le message: « chaîne de classe: TestClass » mais il dit « Classe introuvable ».
Est-ce que quelqu'un sait pourquoi cela se produit et comment je pourrais le réparer?
Ou ai-je besoin de faire ma propre usine de classe. Par exemple, créez une classe avec un tableau statique Object[string] classes;
avec des instances de classe. Quand je veux que je fais une nouvelle instance ceci:
auto i = (className in classes);
if (i is null)
{
return null;
}
return i.classinfo.create();
EDIT:
Je l'utilise maintenant comme ça (un exemple, ceci est pour un modèle HMVC web):
class Page : Controller
{
static this()
{
register(Page.classinfo);
}
protected void registerActions()
{
registerAction("index", &index);
}
public void index()
{
request.response = "Page: " ~ request.params.get("pageID", "0") ~ " in format: " ~ request.params.get("format", "html");
}
};
void main(string[] args)
{
Route.add(
r"page/(\d+)\.(html|json)",
[
1: "pageID",
2: "format"
],
[
"controller": "page" // tell route to use page as controller class
]
);
Route.add(
r"(\S+)/(\S+)",
[
1: "controller", // get controller class from uri
2: "action" // get controller action from uri
]
);
auto request = Request.factory("/page/43.json").execute();
// Headers and response can be accessed like this
// Can be used in http response
uint code = request.getCode();
const(string[string]) headers = request.getHeaders();
string response = request.response;
}
Ce genre de choses est difficile à faire en C++)
Ou pourrait-on surcharger opCast (T: string) pour la classe et ensuite la concaténer par elle-même? – 0scar
Non, car je suis de type Object, que vous ne pouvez pas modifier. Il est plus simple de simplement // dire // ce que vous essayez de faire: transformer l'objet en chaîne et concaténer. Faisant de la magie, les conversions automatiques entre types non apparentés ne demandent que des ennuis. –