2009-02-22 2 views
20

내가 이해하는 것처럼, 인터페이스는 자바이다. 인터페이스를 구현하는 클래스를위한 메소드를 레이아웃하여 디자인을 시행하기위한 것이다. Ruby 모듈과도 같은 생각인가? Java의 인터페이스와 마찬가지로 Ruby에서 모듈을 인스턴스화 할 수 없습니다.Ruby 모듈이 자바 인터페이스와 동일한가요?

답변

7

저는 모듈을 C#의 확장 메소드와 비슷한 것으로 생각한다고 생각합니다. 실제로 다른 곳에 정의 된 기존 클래스에 기능을 추가하고 있습니다. C#이나 Java에는 정확한 아날로그가 없지만 구현이 인터페이스뿐만 아니라 파생되기 때문에 인터페이스로 생각하지 않을 것입니다.

+0

내 자신의 이익을 위해, 나는 나의 평가에 잘못 되었습니까? 그래서 지금까지 그걸 사용 해왔다. 어쩌면 나는 뭔가를 놓치고 있을지도 모른다. –

+0

모듈을 Ruby 클래스에 포함하고 그 동작, 인스턴스 메소드를 최소한 상속받을 수 있습니다. http://www.ruby-doc.org/core/classes/Module.html을보십시오. – tvanfosson

+0

사실입니다. 그 사실을 알았고, 저는 RPG 제작자에게 거의 사용하지 않았습니다. 고마워요, 지금 요점을 봅니다. –

3

루비의 모듈은 정적 클래스에 가깝습니다. 저는 Java 개발자는 아니지만, 이라고 생각하면 Java 인터페이스는 C# 인터페이스와 유사합니다. 즉, 계약을 정의하지만 구현은 정의하지 않습니다.

나는 루비에 대한 경험이 있지만, 비디오 게임 제작 (RGSS/2)에 있어서는 안된다. 나는 베테랑 루비 프로그래머가 알 수있는 많은 것들에 대해 무지하다고 확신한다.

+0

''ruby'' 모듈''이''Java'' 정적 클래스' '와 같은 경우,'C#''네임 스페이스'와 같은'루비''모듈'입니까? – mmcrae

3

루비의 모듈은 다른 것들에 추가 할 수있는 약간의 범위/네임 스페이스입니다. 그것들은 두 가지 뚜렷하지만 관련된 목적을 위해 사용됩니다. 즉, 함께 속하는 많은 것들 (상수, 클래스 등)을 묶어서 다중 상속과 같은 다른 범위에 추가하는 것입니다.

예를 들어 Comparable 및 Enumerable 등의 모듈이 있으며 이러한 형용사가 적용될 경우 기대할 수있는 기능을 캡슐화합니다. 기본 정의 (Comparable의 두 인스턴스와 Enumerable의 반복자를 비교하는 메서드)를 제공하면 모듈을 가져 와서 전체 인터페이스로 찾을 수 있습니다.

한편 Net과 같은 모듈은 거의 없지만 클래스는 Net :: HTTP, Net :: FTP, Net :: SMTP 등과 같은 기능을 제공합니다.

가운데에는 수학이나 프로세스와 같은 것들이 있습니다.

- MarkusQ

17

짧은 대답은 아니오입니다.

Java/C# 인터페이스는 구현 클래스가 최소한 제공 할 메소드 서명을 정의합니다. 또한

:

  • 루비 모듈 때문에 오리 타이핑의 그러한 계약이 없습니다.
  • 모듈은 쉽게 재사용 할 수 있도록 일반적인 기능을 추출하는 방법 일뿐입니다. 가장 가까운 릴레이션은 C# 확장 메소드이지만 정적 컨텍스트에 존재하기 때문에 정확히 일치하지는 않습니다.
  • 모듈은 기존 클래스에 상태를 추가 할 수 있습니다.
  • 모듈
  • 모듈 네임 스페이스
  • 역할을 할 수 있습니다 정적 메서드를 가질 수

예 : 루비에서보기 모듈의 형식적인 관점에서

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 
2

는 "믹스 인"이라고 디자인 패턴을 구현합니다. http://en.wikipedia.org/wiki/Mixin

PHP 특성과 비교할 수 있습니다. 이러한 아키텍처는 다중 상속을 허용하지 않는 언어, 예를 들어, 다중 언어에서 유용합니다. Ruby, PHP.

관련 문제