2010-05-28 35 views
6

Tôi nhận thấy hàm Object.factory (char [] className) trong D. Nhưng nó không hoạt động như tôi hy vọng nó sẽ hoạt động; nó không hoạt động;)Lấy cá thể lớp theo chuỗi tên lớp

Một ví dụ:

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

Tôi nghĩ rằng điều này sẽ dẫn đến việc thông điệp: "chuỗi Class: TestClass" nhưng nó nói "Class không tìm thấy".

Có ai biết tại sao điều này xảy ra và cách tôi có thể khắc phục sự cố không?

Hoặc tôi có cần tạo nhà máy của riêng mình không. Ví dụ bằng cách tạo một lớp với một mảng tĩnh Object[string] classes; với các cá thể lớp. Khi tôi muốn có một ví dụ mới tôi làm điều này:

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

EDIT:

tôi sử dụng nó bây giờ như thế này (một ví dụ, đây là một web HMVC mẫu):

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

Loại công cụ này khó làm trong C++;)

Trả lời

6

Đây là một công trình:

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

Một số điều cần lưu ý:

  1. Bạn phải sử dụng tên lớp đầy-đủ điều kiện. Nếu bạn có nhiều hơn một "TestClass" trong chương trình của bạn.
  2. Bạn không thể nối thêm đối tượng vào chuỗi; bạn phải sử dụng toString. Điều đó, hoặc chỉ đơn giản là sử dụng writefln("Class string: %s", i).
+0

Hoặc một người có thể quá tải opCast (T: string) cho lớp học và sau đó tự nó liên kết không? – 0scar

+0

Không, bởi vì tôi thuộc loại đối tượng mà bạn không thể sửa đổi. Nó đơn giản hơn để chỉ // nói // bạn đang cố gắng làm gì: biến đối tượng thành một chuỗi và nối. Làm phép thuật, chuyển đổi tự động giữa các loại không liên quan chỉ là cầu xin sự cố. –

Các vấn đề liên quan