2011-06-22 43 views
6

Nói, các lớp A1, A2, ..., Tất cả mở rộng lớp trừu tượng B. Tôi muốn A1, ..., An để có hàm trả về một chuỗi tên lớp. Điều này chắc chắn được biết đến trong thời gian biên dịch, nhưng tôi muốn thực hiện chức năng này trong B và sử dụng thừa kế để tất cả Ai: nhận được chức năng này.Chức năng trả về tên lớp trong D

Trong java, điều này có thể dễ dàng được thực hiện, bằng cách cho phép B có phương pháp

String getName() { 
    return this.getClass(); 
} 

nhiều hơn hoặc ít hơn. Vì vậy, làm thế nào để tôi làm điều này trong D? Ngoài ra, có cách nào, sử dụng các đặc điểm hoặc tương tự, để xác định thành viên lớp nào là công khai?

Trả lời

3

Nó được biết tại thời gian biên dịch, nhưng việc đánh giá tên lớp vào thời gian chạy đòi hỏi phải tháo gỡ, tôi nghĩ vậy.

Dưới đây là nếu runtime đánh giá là ổn:

import std.stdio; 
import std.algorithm; 

abstract class B { 
    string className() @property { 
     return this.classinfo.name.findSplit(".")[2]; 
    } 
} 

class A1 : B { } 
class A2 : B { } 

void main() 
{ 
    auto a1 = new A1(); 
    writeln(a1.className); 

    auto a2 = new A2(); 
    writeln(a2.className); 
} 
3

Bạn có thể lấy tên của một lớp học chỉ đơn giản bằng cách sử dụng ClassName.stringof.

Nếu bạn muốn nó là một hàm ảo thì tôi sẽ khuyên bạn sử dụng các Curiously Recurring Template Pattern:

class B 
{ 
    abstract string getName(); 
} 

class BImpl(T) 
{ 
    string getName() { return T.stringof; } 
} 

class A1 : BImpl!A1 { ... } 
class A2 : BImpl!A2 { ... } 
/+ etc. +/ 

Thật không may, tại thời điểm này không có cách nào để xác định lớp thành viên được công khai. Bạn có thể lặp lại tất cả các thành viên bằng cách sử dụng allMembers trait.

foreach (member; __traits(allMembers, MyClass)) 
    writeln(member); 
Các vấn đề liên quan