按类名字符串获取类实例

时间:2010-05-28 16:07:04

标签: oop d factory-pattern

我注意到D中的函数Object.factory(char [] className)。 但它不像我希望的那样有效;它不起作用;)

一个例子:

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);
    }
}

我认为这应该会产生一条消息:“Class string:TestClass”,但它会显示“Class not found”。

有谁知道为什么会发生这种情况以及如何解决这个问题?

或者我是否需要建立自己的班级工厂。例如,通过使用类实例创建具有静态数组Object[string] classes;的类。当我想要一个新实例时,我这样做:

auto i = (className in classes);
if (i is null)
{
    return null;
}
return i.classinfo.create();

修改

我现在就像这样使用它(例如,这是针对Web HMVC模式):

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;
}

这种东西在C ++中很难做到;)

1 个答案:

答案 0 :(得分:6)

这是一个有效的方法:

module irc2;

import std.stdio;

class TestClass
{
    override string toString()
    {
        return typeof(this).stringof; // TestClass
    }
};

void main(string[] args)
{
    auto i = Object.factory("irc2.TestClass");
    if (i is null)
    {
        writeln("Class not found");
    }
    else
    {
        writeln("Class string: " ~ i.toString);
    }
}

有几点需要注意:

  1. 您必须使用完全限定的类名。如果您的程序中有多个“TestClass”,该怎么办?
  2. 您不能将对象附加到字符串;你必须使用toString。那,或者只是使用writefln("Class string: %s", i)