2013-07-24 23 views
5

Tôi là một lập trình viên sở thích hợp lý kinh nghiệm, và tôi đã quen thuộc với C++, D, Java, C# và những người khác.Những ngôn ngữ nào khác hỗ trợ kiểu giao tiếp của Go mà không khai báo rõ ràng?

Ngoại trừ Go, hầu như mọi ngôn ngữ đều yêu cầu tôi nêu rõ rằng tôi đang triển khai giao diện. Đây là đường biên vô lý, vì hôm nay chúng ta có các trình biên dịch cho các ngôn ngữ như Haskell, có thể thực hiện gần như toàn bộ kiểu suy luận của chương trình với rất ít gợi ý.

Những gì tôi đang tìm kiếm là một ngôn ngữ lập trình mà thực hiện điều này:

interface ITest { 
    void Test(); 
} 

class Test { 
    void Test() { } 
} 

void main() { 
    ITest x; 
    x = new Test; 
} 

Những ngôn ngữ sẽ thấy điều này, và tự động cờ Test như thực hiện ITest?

ETA: Tôi không tìm kiếm cách nhập vịt. Tôi đang tìm kiếm các ngôn ngữ được đánh máy đúng với suy luận.

+0

JavaScript có được tính không? Bạn có thể gọi hàm 'Test()' trên bất kỳ đối tượng nào có nó mà không cần phải khai báo một giao diện. –

+0

Tôi không chắc câu hỏi này phù hợp với SO. Nếu bạn muốn có một danh sách các ngôn ngữ có tính năng tuyệt vời này của Go, có thể lập trình viên sẽ tốt hơn. –

+1

Bạn đang tìm kiếm bất kỳ ngôn ngữ nào bằng cách gõ vịt? JS, Python, Ruby, v.v ...? –

Trả lời

12

D có một cái gì đó gọi là wrap trong thư viện chuẩn của nó, Phobos, có thể làm những gì bạn đang tìm kiếm. Dưới đây là ví dụ được sao chép từ hàm chưa được khai báo:

interface A { 
    int run(); 
} 

interface B { 
    int stop(); 
    @property int status(); 
} 

class X { 
    int run() { 
    return 1; 
    } 

    int stop() { 
    return 2; 
    } 

    @property int status() { 
    return 3; 
    } 
} 

auto x = new X(); 

auto ab = x.wrap!(A, B); 
A a = ab; 
B b = ab; 
assert(a.run() == 1); 
assert(b.stop() == 2); 
assert(b.status == 3); 

Công việc sẽ có sẵn bắt đầu từ v2.064 và đã có trên git HEAD.

+1

Đây là liên kết đến yêu cầu kéo https://github.com/D-Programming-Language/phobos/pull/1265 – yaz

+1

Ngoài ra nếu bạn muốn quay lại X ban đầu, chỉ cần 'ab.unwrap! X()'. –

0

Hầu như bất kỳ ngôn ngữ động nào ngoài đó (javascript, python, v.v ...) đều hỗ trợ mẫu này. Nhưng tôi đoán bạn quan tâm đến các ngôn ngữ xác minh tĩnh rằng loại thỏa mãn giao diện được đề cập.

C++

Sự hỗ trợ này không phải là chính xác những gì bạn đang yêu cầu cho dù bởi vì bạn sẽ không sử dụng ITest trực tiếp. Thay vào đó bạn sẽ sử dụng một mẫu mà chỉ cần truy cập các thành viên cần thiết của các loại

// C# style solution 
void UseIt(ITest p) { 
    p.Test(); 
} 

// C++ style solution 
template <typename T> 
void UseIt(T p) { 
    p.Test(); 
} 

Phương pháp C++ UseIt sẽ làm việc cho bất kỳ loại trong đó có một thành viên truy cập Test. Không có giao diện cần thiết ở đây

class C1 { 
public: 
    void Test() { } 
} 

class C2 { } 

UseIt<C1>(C1()); // Ok 
UseIt<C2>(C2()); // Error! 

nguyên cảo

nguyên cảo trực tiếp thực hiện các mô hình bạn mô tả. Vào cuối của các loại bản ghi ngày chỉ là một wrapper mỏng trên javascript và do đó năng động. Nhưng nó cung cấp các chú thích kiểu thời gian biên dịch. Đó là hỗ trợ cho các giao diện chính xác phù hợp với mô hình bạn mô tả trong câu hỏi

F #

F # có hỗ trợ tương tự như C++ qua những hạn chế thành viên trên tờ khai inline

let inline UseIt<^T when ^T : (member Test: unit -> unit)> s = ... 
+0

Vâng, và D là tương tự như C + + trong khía cạnh này. –

+0

@ AdamD.Ruppe tôi giả định D là nhưng tôi không có đủ kinh nghiệm với nó để nhận xét thông minh về nó – JaredPar

+0

Đây không phải là những gì tôi đang tìm kiếm: Một mẫu/giải pháp di truyền có (trừ khi trình biên dịch VERY thông minh) một số các chuỗi mã máy được liên kết, trong khi một giải pháp giao diện thường chỉ có một (phụ thuộc vào tra cứu bảng giao diện). –

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