태그 보관물: interfaces

interfaces

인터페이스를 구현하면 상속이라고합니까? 상속을 따르고 있다고 말할 수 있습니까? 나는

내 수업 implements이 인터페이스라면 상속을 따르고 있다고 말할 수 있습니까? 나는 클래스가 extends다른 클래스라면 상속 이라는 것을 알고 있습니다.



답변

업데이트 :이 답변을 수정했습니다. 부를 가치가있는 의견에서 여러 가지 좋은 점이 제기되었습니다.

내 클래스가 인터페이스를 구현하면 상속을 따르고 있다고 말할 수 있습니까?

“상속을 따른다”라는 말의 의미가 완전히 명확하지는 않습니다. 약간 다른 질문을하겠습니다.

상속이란 무엇입니까?

  • 한 유형 X의 구성원이 다른 유형 Y의 구성원으로 간주되면 Y의 해당 구성원은 X에서 상속됩니다 .
  • 일부 유형 간에는 상속 관계가 있습니다. 즉, 일부 유형 X 및 Y의 경우 “Y는 X에서 상속됩니다”라고 말합니다.

이들은 미묘하게 다릅니다. 혼란 스럽기 때문에 불행합니다.

이 미묘한 차이로 인해 일반적으로 어떤 혼란이 발생합니까?

사람들이 상속을 구현 세부 사항을 공유하는 메커니즘으로 생각하기 때문에 혼란이 발생할 수 있습니다. 그것이 비록 입니다 이러한 메커니즘은, 그 메커니즘을 공유하여 작동 회원 . 해당 멤버는 구현이 필요하지 않습니다! 우리가 볼 수 있듯이, 그것들은 추상적 일 수 있습니다.

이 혼동을 피하기 위해 Java와 C # 스펙이 인터페이스 메소드와 클래스 간의 관계를 설명하기 위해 “상속”이외의 단어를 사용한 경우 개인적으로 더 행복 할 것입니다. 그러나 그것들은 그렇지 않으며, 우리는 사양에 반대 하지 않고 사양 에서 추론 해야합니다.

Java에서는 인터페이스 멤버를 구현하는 클래스가 인터페이스 멤버를 상속합니까?

예, 일부는 있습니다. 편의를 위해 여기에 인용 한 Java 사양 섹션 8.4.8을 참조하십시오.

클래스 C는 직접 수퍼 클래스와 직접 수퍼 인터페이스를 상속받으며 다음의 모든 것이 참인 추상 및 기본 메소드 m : […]

클래스가 인터페이스를 구현한다고하면 클래스는 해당 인터페이스 의 추상 및 기본 메소드를 상속합니다 . (물론, 다음 조건을 생략했습니다. 자세한 내용은 사양을 참조하십시오. 특히, 인터페이스의 멤버를 구현하는 클래스는 해당 멤버를 상속 한 것으로 간주 되지 않습니다 . 다시 말하지만 혼란 스럽습니까?)

우리는 일반적으로 자바에서 클래스가 인터페이스에서 상속한다고 말합니까?

일반적으로 클래스 가 인터페이스를 구현 한다고 말합니다 . 위에서 언급했듯이 클래스는 인터페이스에서 멤버 를 상속 할 수 있지만 여전히 인터페이스에서 상속한다고는 말할 수 없습니다. 혼란 스럽습니다.

이 미묘한 차이가 일상적인 일에서 중요합니까?

일반적으로 그렇지 않습니다. 이러한 종류의 사양 분석은 라인업 개발자보다 컴파일러 작성자에게 더 유용합니다. “상속”의 정확한 정의를 얻는 것보다 인터페이스 사용시기를 이해하는 것이 더 중요합니다.


답변

상속 은 수퍼 클래스에 대한 새로운 서브 클래스를 작성하는 것을 의미합니다. 인터페이스에 대해 새 클래스를 작성하면 해당 인터페이스가 구현 됩니다. 이전 인터페이스를 기반으로 새 인터페이스를 작성하면 해당 인터페이스 가 확장 됩니다.

세 가지 가능성 모두에 적용되는 유일한 올바른 용어는 subtyping 입니다. 모든 하위 유형이 하위 클래스 인 것은 아닙니다.


답변

서브 클래스 , 당신

  • 수퍼 클래스의 상태 상속
  • 실제 구현을 상속합니다 (추상적이지 않은 모든 메소드)

인터페이스를 사용 하면 선언 된 메소드 를 구현 하여 계약을 완료 합니다.

그것이 고전적인 방법입니다. 이제 Java 8 에서는 인터페이스가 혼합되어 있습니다.

  • 인터페이스에는 여전히 인스턴스 변수가 없으므로 상태를 상속하지 않습니다.
  • 이제 인터페이스에서 기본 구현상속 할 수 있습니다

모든 메소드가 기본 구현을 가진 인터페이스를 구현하면 여전히 ‘구현’또는 확장으로 계산됩니까? 나는 말할 수 없었다. 이 경우는 상당히 멀리 가져 오기 때문에 (실제로 상태 비 저장 다중 상속을 활성화) 서브 클래스에서만 ‘상속’을 사용합니다.


답변