2013-06-03 2 views
21

특징, 믹스 인 및 인터페이스 간의 유사점은 무엇입니까 &. 이 개념을 더 깊이 이해하려고 노력하고 있지만 이러한 기능을 구현하는 프로그래밍 언어가 충분하지 않아서 유사점과 차이점을 진정으로 이해할 수 없습니다. 특성, 유지 mixin 및 인터페이스특성 vs. 인터페이스 vs. 믹스 인?

  • 각각에 대해

    문제는 어떻게 해결하고 있습니까?
  • 개념의 정의가 프로그래밍 언어 전반에서 일관성이 있습니까?
  • 다른 사람들과의 유사점은 무엇입니까?
  • 다른 점과 다른 점은 무엇입니까?
+1

스칼라에는 특성 만 있습니다 (믹스 인 및 인터페이스는 형질에 포함됩니다).귀하의 프로필을 보면 Java 배경이있는 것 같습니다. Scala를 사용해보아야한다. 현재 클래스와 직각 인 구현을 믹스 할 때 매우 편리하다. 형질을 쌓기를 원할 때 바로하는 것이 어렵습니다. 자세한 내용은 http://www.artima.com/pins1ed/traits.html을 참조하십시오. – huynhjl

+0

@ams : [answer] (http://stackoverflow.com/a/23124968/33311)를보십시오. 태그가 "그루비"라고해도 유용 할 수 있습니다. – Lernkurve

답변

10

Object을 제외한 Java의 모든 reference type은 하나의 단일 수퍼 클래스에서 파생됩니다.

그런데 Java 클래스는 0 개 이상의 인터페이스를 구현할 수 있습니다.

일반적으로 인터페이스는 구현 클래스를 강제로 구현하는 방법을 설명하는 계약이지만 구현을 직접 제공하지는 않습니다.

즉, Java 클래스는 계약을 준수하여 구현하도록 선언 된 인터페이스가 제공하는 메소드 서명에 구현을 제공해야합니다.

인터페이스는 유형을 구성합니다. 따라서 매개 변수를 전달하고 인터페이스 유형으로 선언 된 메소드에서 리턴 값을 가질 수 있으므로 매개 변수와 리턴 유형이 반드시 특정 구현을 제공하지 않고 특정 메소드를 구현하는 방식이 필요합니다.

예를 들어 dependency injection과 같은 여러 추상화 패턴의 기초를 설정합니다.

스칼라에는 자체 특성이 있습니다. 특성은 Java 인터페이스의 모든 기능을 제공하며 메소드 구현 및 변수를 포함 할 수 있다는 점에서 큰 차이가 있습니다. 형질은 메서드를 한 번만 구현하는 현명한 방법이며,이를 통해 형질을 확장하는 모든 클래스에 이러한 메서드를 배포합니다. Java 클래스의 인터페이스와 마찬가지로 두 개 이상의 특성을 Scala 클래스에 혼합 할 수 있습니다.

내가 더 루비 배경이 없기 때문에,하지만, 나는 데이비드 폴락의 "시작 스칼라"(amazon link)에서 발췌 한 당신을 가리킬 수 있습니다 :

루비가 될 수있는 방법의 모음이나 mixin을 가지고 어떤 수업에도 섞여있다. Ruby에는 정적 유형 지정이 없으므로 메소드 매개 변수의 유형을 선언 할 방법이 없으므로 mixins를 사용하여 인터페이스와 같은 계약을 정의하는 합리적인 방법이 없습니다. Ruby 믹스 인은 코드를 클래스로 구성하는 메커니즘을 제공하지만 매개 변수 유형을 정의하거나 강제하는 메커니즘은 제공하지 않습니다.

인터페이스는이 게시물에서 설명한 것 이상을 할 수 있습니다. 주제가 방대 할 수 있기 때문에 세 방향의 각각에 대해 더 자세히 조사 할 것을 제안합니다. Java 배경이있는 경우 스칼라와 특성이 배우기에 적당합니다.

+0

모든 * refererence * 유형은 Object에서 파생된다는 것을 분명히해야합니다. 프리미티브는 그렇지 않습니다. 나는 "인터넷에서 광범위하게 말한대로 ..."이라는 문장을 삭제하거나 잘 알려진 기사에 대한 링크를 제공합니다. – coltfred

+1

@coltfred : 편집 완료. –

+0

Pollak의 의견에 동의하지 않습니다. "인터페이스와 같은 계약을 정의하기 위해 mixins를 사용하는 합리적인 방법은 없습니다"- [계약은 * 주로 * 방법 *입니다] (https://www.eiffel.com/values/design - 계약/소개 /), 그렇습니다. 둘째, "매개 변수 유형을 정의하거나 강제하는 메커니즘이 아닙니다"- Ruby는이를 위해 오리 타이핑과 메소드 이름 지정을 사용합니다. [이 답변에 대한 더 많은 것을보십시오] (http://stackoverflow.com/a/177127/335847) – iain