2014-03-02 2 views
3

저는 C++ 14/17에서 소개 될 개념에 대해 몇 가지 독서를하고 있습니다. 자바 인터페이스로 개념적으로, 거의 같은이되지C++ 개념과 Java 인터페이스의 차이점은 무엇입니까?

// Define the concept (from wikipedia) 
auto concept less_comparable<typename T> { 
    bool operator<(T); 
} 

// A class which implements the requirements of less_comparable, 
// with T=`const string &` 
class mystring 
{ 
    bool operator < (const mystring & str) { 
     // ... 
    } 
}; 

// Now, a class that requires less_comparable 
template <less_comparable T> 
class my_sorted_vector 
{ 
    // ... 
}; 

// And use my_sorted_vector 
my_sorted_vector<int> v1;     // should be fine 
my_sorted_vector<mystring> v2;    // same 
my_sorted_vector<struct sockaddr> v3;  // must give error? 

내 질문은 : 내가 이해 무슨에서, 우리는 정의와 같은 개념을 사용합니까? 그렇지 않다면 어떻게 다른가요?

감사합니다.

+0

당신은 개념과 상속이 절대적으로 서로 * * 전혀 * 상관 없다는 것을 알고 있습니까? 또한 Java 인터페이스는 약형이며 개념은 매우 강력하게 입력됩니다. – Puppy

+0

@FredOverflow 개념을 사용하지 않으면 개념과 비슷한 효과를 얻을 수 있습니다. 템플릿 매개 변수가 코드에서의 사용과 호환되지 않으면 코드는 현재 컴파일되지 않습니다 (혼동되는 오류 메시지가 있음에도 불구하고). –

+0

@DeadMG 예, 알고 있습니다. 내 의견을 삭제했습니다. 그것은 너무 호언 장담했다. 죄송합니다. –

답변

6

Java 인터페이스는 유형을 정의합니다. 예를 들어, Comparable<String> 유형의 변수를 가질 수 있습니다. C++ 개념은 이 아니라 형식을 정의합니다. 유형이 less_comparable<string> 인 변수를 사용할 수 없습니다.

개념 은 유형을 분류하는 것과 마찬가지로 유형을 분류합니다. 개념은 유형 위의 한 단계입니다. 다른 프로그래밍 언어에서 개념은 "메타 유형"또는 "유형 클래스"와 같은 다른 이름을가집니다.

+1

+1 "개념은 유형이 유형을 분류하는 것처럼 값을 분류합니다". –

+0

무엇이든, 개념은 Java의 제네릭에 대한'extends' 제약 조건과 가장 비슷하거나, 최소한 의도와 비슷합니다. –

+0

그것은 다음과 같은 함수를 작성할 수 없다는 것을 의미합니다 :'public bool someFunc (less_comparable a, less_comparable b) {return a

0

Java 인터페이스에는 상속 관계가 필요합니다. 개념은 duck typing과 유사하게 작동합니다. 개념에 필요한 연산자/구성원을 제공하는 모든 개체는 개념과 호환됩니다.

+0

저는 자바 프로그래머가 아니지만 Java에서 인터페이스와 상속이 뚜렷하다는 사실을 이해하고 있습니다 (키워드'implements'와'extends'). 예를 들어 Java 클래스는 인터페이스의 수를 제한없이 구현할 수 있지만 Java에서는 단일 상속 만 허용합니다. – Praxeolitic

+0

@Praxeolitic Java는 충돌하는 기본 클래스의 "다이아몬드 문제"를 피하기 위해 구현 (확장)의 단일 상속 만 허용합니다. 인터페이스는 여전히 상속을 사용하며, 암시 적으로 추상적 인 멤버 메소드 (최근에는 기본 메소드로 완화)에만 제한되며 멤버 필드는 포함 할 수 없습니다 (다이아몬드 문제 : 오브젝트 당 존재하는 상태의 사본 수는 어느 정도입니까?). 이 제한을 제외하고 많은 제한은 언어를 모두 처리합니다. – josefx

관련 문제