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
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.
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.
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
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
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
Từ quan điểm chính thức của xem module trong Ruby thực hiện thiết kế mẫu gọi là "mixin". http://en.wikipedia.org/wiki/Mixin
Nó có thể được so sánh với các đặc điểm PHP. http://php.net/manual/en/language.oop5.traits.php
Kiến trúc như vậy hữu ích bằng các ngôn ngữ không cho phép đa kế thừa, ví dụ: Ruby, PHP.
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ì đó. –
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
Đó 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ờ. –