2009-02-22 24 views
20

Như tôi đã hiểu, một giao diện là Java được thiết kế để thực thi một thiết kế bằng cách đặt ra các phương thức cho các lớp thực hiện giao diện để điền vào. Đây có phải là ý tưởng với một mô-đun Ruby không? Tôi thấy rằng giống như với Giao diện trong Java, bạn không thể khởi tạo một mô-đun trong Ruby.Mô-đun Ruby có tương đương với Giao diện Java không?

Trả lời

7

Tôi nghĩ rằng tôi muốn cân bằng một mô-đun để một cái gì đó giống như một phương pháp mở rộng trong C#. Bạn đang thêm chức năng vào một lớp hiện có được định nghĩa ở nơi khác. Không có một tương tự chính xác trong cả hai C# hoặc Java, nhưng tôi chắc chắn sẽ không nghĩ về nó như là một giao diện bởi vì việc thực hiện có nguồn gốc cũng như giao diện.

+0

Vì lợi ích của riêng tôi ở đây, tôi có sai trong đánh giá của tôi không? Đó là cách tôi đã sử dụng chúng cho đến bây giờ, có lẽ tôi đang bỏ lỡ một cái gì đó. –

+0

Bạn có thể bao gồm một mô-đun trong lớp Ruby và kế thừa hành vi của nó, các phương thức thể hiện ít nhất. Hãy xem http://www.ruby-doc.org/core/classes/Module.html – tvanfosson

+0

Đó là sự thật, tôi đã biết về điều đó, tôi hiếm khi sử dụng nó trong nhà sản xuất rpg. Cảm ơn, tôi thấy điểm này ngay bây giờ. –

3

No. Một mô-đun trong ruby ​​giống như một lớp tĩnh. Tôi không phải là nhà phát triển Java, nhưng tôi đang đoán rằng các giao diện Java tương tự như giao diện C#, tức là, chúng xác định hợp đồng, nhưng không phải là triển khai.

Tôi không nên làm như vậy, trong khi tôi có kinh nghiệm về hồng ngọc, nó đang được tạo trong trò chơi điện tử (RGSS/2). Tôi chắc chắn rằng tôi không biết gì về nhiều thứ mà một lập trình viên ruby ​​kỳ cựu sẽ biết.

+0

vì vậy nếu một mô-đun 'ruby'' giống như một 'lớp Java' 'tĩnh, thì đó là một' ma trận' 'như một' C# '' không gian tên'? – mmcrae

3

Mô-đun trong ruby ​​là một chút phạm vi/không gian tên có thể được thêm vào những thứ khác. Chúng được sử dụng cho hai mục đích riêng biệt nhưng có liên quan: gộp lên một loạt các thứ liên quan (hằng số, các lớp, vv) thuộc về nhau và sau đó thêm chúng vào một phạm vi khác (giống như đa thừa kế).

Ví dụ: có các mô-đun được gọi là những thứ như Có thể so sánh và Có thể đếm được, v.v. đóng gói chức năng bạn mong đợi nếu có những tính từ này được áp dụng. Bằng cách cung cấp một định nghĩa cơ bản (một phương thức so sánh hai cá thể cho Comparable và một iterator cho Enumerable), bạn có thể import module và tìm cho mình một giao diện đầy đủ.

Mặt khác, có các mô-đun như Net mà bạn hiếm khi đưa vào lớp nhưng cung cấp một gói chức năng như Net :: HTTP, Net :: FTP, Net :: SMTP, v.v.

Ở giữa có những thứ như Toán và Quy trình có thể được sử dụng theo cách này hay cách khác.

- MarkusQ

17

Câu trả lời ngắn gọn là không.

Đây là lý do, một giao diện Java/C# xác định chữ ký phương thức mà lớp triển khai sẽ cung cấp ở mức tối thiểu.

Ngoài ra:

  • Với module ruby ​​không có hợp đồng như vậy vì con vịt-gõ.
  • Mô-đun chỉ là một cách để trích xuất các chức năng phổ biến để dễ sử dụng lại. Mối quan hệ gần nhất là các phương thức mở rộng C#, nhưng chúng không phải là một kết hợp chính xác vì chúng tồn tại trong một ngữ cảnh tĩnh.
  • Mô-đun có thể thêm trạng thái vào lớp hiện có.
  • Modules có thể có phương pháp tĩnh
  • module có thể hoạt động như không gian tên

Ví dụ:

module SimpleConversation 
    class NamespacedExample 
    def poke 
     puts "ouch" 
    end 
    end 

    attr_accessor :partner_name 
    def converse 
    partner_name ||= "Slowpoke" 
    speak + "\n#{partner_name}: Yes they are" 
    end 

    def self.yay 
    puts "yay" 
    end 
end 

class Foo 
    include SimpleConversation 
    attr_accessor :name 

    def speak 
    name ||= "Speedy" 
    "#{name}: tacos are yummy" 
    end 
end 

x = Foo.new 
x.name = "Joe" 
x.partner_name = "Max" 
puts x.speak 
puts x.converse 

y = SimpleConversation::NamespacedExample.new 
y.poke 

SimpleConversation.yay 
Các vấn đề liên quan