추상 메소드 만있는 인터페이스와 추상 클래스간에 차이점이 있습니까?


9

추상 클래스가 있고이 클래스에 추상 메소드 만 있다고 가정 해 봅시다. 이 추상 클래스는 메소드가 동일한 인터페이스와 다른가?

내가 알고 싶은 것은 추상적 멤버와 동등한 인터페이스를 가진 추상 클래스 간의 철학적, 객관적 및 기본 프로그래밍 언어 구현에 차이점이 있는지 여부입니다.


어느 언어?
kevin cline

내가 알 수있는 한, 귀하의 질문은 두 번 , 여기여기에 두 번 답변 됩니다 . 이 두 가지 답변은 언어에 구애받지 않으며 C #에만 해당되는 것은 아닙니다.
gnat

3
@blank 질문에 중복 상태가 적용되는 것에 동의하지 않아 다시 열었습니다. 또한 귀하의 질문을 더 명확하게 설명하기 위해 귀하의 질문을 편집했습니다.
maple_shaft

답변:


22

기술적으로 차이점은 실제로 중요하지 않지만 개념 상으로는 완전히 다른 것이므로 다른 사람들이 언급 한 기술적 차이로 이어집니다.

추상 수퍼 클래스는 정확히 들리는 것과 같으며, 고양이와 개는 동물과 같은 다른 많은 유형과 공유되는 공통 유형입니다.

인터페이스는 또한 소리처럼 들리며, 다른 클래스가 객체와 통신 할 수있는 인터페이스입니다. Cat Walk를 만들고 싶다면 Cat에서 CanWalk 인터페이스를 구현해야합니다. 그들은 매우 다르게 걷는 도마뱀도 마찬가지입니다. 반면에 뱀은 CanWalk를 구현하지 않으므로 Walk에게 말할 수 없습니다. 한편, Lizard와 Snake (또는 더 명백한 서브 클래스-전문가가 아님)는 모두 피부를 깎아내어 CanShed를 구현할 수 있지만 Cat은 그렇게 할 수 없습니다.

그러나 그들은 모두 여전히 동물이며 살아 있는지 또는 죽은 지와 같은 일반적인 속성을 가지고 있습니다.

이것이 인터페이스의 모든 메소드가 공용으로 (또는 C #에서 명시 적으로) 구현되어야하는 이유입니다. 클래스와 객체 사이의 인터페이스에서 숨겨진 인터페이스의 요점은 무엇입니까? 언어가 다중 상속을 지원하지 않는 경우에도 객체에 대한 여러 인터페이스를 가질 수있는 이유이기도합니다.

당신의 질문으로 돌아가서, 이런 식으로 볼 때, 완전히 추상적 인 수퍼 클래스를 가질 이유는 거의 없습니다.


4
고양이는 뱀이나 도마뱀보다 훨씬 더 성가신 방식으로 흘리지 만 +1.
Matthew Flynn

기술적으로 : 추상적 인 방법을 보호 할 수 있습니다. 인터페이스 방법이 불가능합니다.
Jacques Koorts

19

대부분의 OOP 언어에서 구현 클래스는 하나의 추상 클래스에서만 파생 될 수 있지만 여러 인터페이스를 구현할 수 있습니다.


3
대부분? 어느 쪽을 세고 있습니까? 내가 아는 대부분의 OOP 언어에는 인터페이스 나 추상 클래스가 없습니다. C ++에는 추상 클래스 만 있습니다.
kevin cline

10
@kevincline : 아마도 C #, Java 및 VB.NET.
tdammers

1
@ kevincline, 나는 "둘 다 가지고"부족한 것 같아요. IIRC의 Ada에서 인터페이스에 대한 동기는 디자이너가 일반적인 다중 상속 기능을 원하지 않았지만 인터페이스의 특수한 경우는 제공하지 않는 것이 너무 중요하다고 생각했습니다.
AProgrammer

@tdammers : LOL. 즉 이었다 바로 농담?
kevin cline

3

다중 상속을 허용하고 인터페이스가없는 C ++와 같은 언어에서 모든 메소드가 추상적 인 추상 클래스는 인터페이스로 사용할 수 있습니다. 나는 C ++로 그다지 많은 일을하지 않았지만 기본 클래스에 동일한 이름을 가진 메소드가있을 때 다중 상속이 문제를 일으킬 수 있다고 생각합니다.

PHP와 C #과 같은 언어에서 인터페이스는 유사한 다형성을 달성하는 수단을 제공하지만 추상 클래스 상속과 인터페이스 구현 사이에는 개념적 차이가 있으므로 "상속"이라고하는 것을 싫어합니다. 인터페이스 자체는 구현을 제공하지 않기 때문에 충돌 문제를 제거합니다.

인터페이스는 외부 세계와의 계약 역할을하지만 추상 클래스는 구현을 제공 할 수 있지만 인터페이스를 "가짜"로 사용하더라도 구현하지 않을 수 있습니다.

개념 상 주요 차이점은 클래스가 다른 클래스를 상속 할 때 (추상적이든 아니든) "is"의 관계가 있으므로 a Car는 a VehicleDoga라는 것 Animal입니다. 인터페이스를 사용하면 객체가 중요한 일을합니다. 모두 그렇게 Car하고 Dog있습니다 Move()그들이 구현하기 때문에 소비자는 그것을 알고 Movable있지만, 자동차는 확실히 아니다 Dog, 나 Animal. 그리고 이동 구현은 다르지만 (바퀴와 다리는 다름) 소비 코드는 중요하지 않습니다. 인터페이스는 구현이 아니라 소비 코드에 관한 것입니다.

주요 요점은 원하는 언어로 된 인터페이스가 있다면 인터페이스를 사용하는 것입니다. 그렇지 않은 경우 (C ++ 에서처럼) 순수 추상 클래스를 사용하여 위조 할 수 있습니다.


당신이 IAnimal이있는 둘 수 있도록 인터페이스뿐만 아니라 유형입니다 Dog하고 Cat 있습니다 .
Amy Blankenship

내 의견으로는, 인터페이스는 외부 세계에 노출되는 행동에 관한 것이지, 객체가 무엇인지에 대한 것이 아닙니다. 상속은 어떤 것이 다른 종류의 것임을 의미합니다 (고양이는 동물입니다). 인터페이스는 단지 그 객체가 할 수있는 것을 말합니다. 그렇기 때문에 인터페이스에서 "상속"이 아닌 "구현"이 무엇인지 말하고 싶습니다. 대부분의 .Net 사람들이 말한 것입니다 (구문이 상속과 구현에서 동일하기 때문에 추측합니다).
Ivan Pintar

2

추상 클래스에는 추상 보호 메소드가 있습니다 (작업중 인 언어로). 인터페이스 메소드는 일반적으로 공개입니다. 이 차이가 유용한 착취를 허용하는지 여부는 모르겠습니다.

편집 먼저 개인 추상 메소드를 사용할 필요가 없다고 생각했지만 이제는 해당 메소드가 호출되지 않도록하는 데 사용될 수 있음을 상기했습니다. 이렇게하면 객체의 복사 생성자가 호출되는 것을 방지 할 수 있습니다.


1
보호 된 가상 (재정의 가능) 메소드는 프레임 워크의 일부이거나 이와 유사한 클래스에 유용 할 수 있습니다. 이렇게하면 추상을 상속하는 클래스의 사용자 지정 코드가 해당 기능을 제공 할 수 있습니다. 기본 클래스에서 인터페이스를 상속하지만 실제로 메소드를 구현하지 않음으로써이를 달성 할 수도 있지만
Ivan Pintar

그렇습니다, 나는 그런 것에 대해 생각하고 있었지만 그것에 경험이 없기 때문에 판단 할 수 없었습니다. 입력 해 주셔서 감사합니다.
토마스

그냥 참고하십시오. 일부 언어에서는 전용 가상 메서드가 파생 클래스에서 재정의 될 수 있습니다.
Johan Boulé

2

예, 다릅니다. 그렇지 않으면 언어 디자이너가 두 가지를 모두 제공하지 않았을 것입니다. 클래스와 인터페이스를 분리하는 두 가지 언어, Java와 C #, Java의 돌연변이 클론을 알고 있습니다. 디자이너는 다중 클래스 상속을 지원하지 않도록 인터페이스를 만들었습니다. 대부분의 다른 언어는 다중 클래스 상속을 지원하므로 클래스와 인터페이스를 분리하지 않습니다.


2

주요 차이점은 다음과 같습니다. 추상 클래스에서-모든 메소드가 모두 추상적이더라도 데이터 멤버 (인스턴스 변수)와이를 구현하는 클래스에 일부 코드 (개인 메소드 또는 생성자 형식)를 제공 할 수 있습니다. 정적 블록; 하위 클래스 작업의 일부를 수행하고 구현에 도움을줍니다.

한 가지 긍정적 인 부작용 : 코드가 한 곳에 있으므로 한 곳에서 수정해야합니다. 하위 클래스는 수퍼 클래스 메소드를 호출 한 다음 수퍼 클래스 조치로 충분하다면 다른 것을하거나 아무것도하지 않을 수 있습니다. 수퍼 클래스는 각 하위 클래스 가이 결정을 내리기를 원하므로 모든 구현을 추상으로 표시했습니다 (일부도 비어있을 수 있음)

질문과 관련이 없지만 인터페이스가 있다는 것은 하나의 클래스가 두 개의 다른 계약을 구현할 수 있음을 의미합니다. 이것이 추상 수퍼 클래스에 비해 인터페이스의 이점입니다


1
구현없이 정의 된 메소드를 추상화하지 않고 상속 클래스에 구현을 남겨 두지 않습니까?
Ivan Pintar

네 당신의 권리 그럼 난 그냥 그 변수, 생성자 및 정적 및 개인 메서드를 생각한다면
tgkprog

@Pinetree, 실제로 대부분의 경우 추상 클래스 (적어도 내가 사용하는 언어, 추상 클래스에 대한 특수 구조가없는 언어)에서 최소한 "실제"코드를 원할 것입니다.
Amy Blankenship

@AmyBlankenship 네, 대부분의 추상 클래스에는 "실제"코드가 있습니다 (그것이 거기에 있습니다). 그러나 인터페이스가없는 C ++과 같은 언어로 인터페이스 역할을하는 순수 추상 클래스의 컨텍스트 내에서 추상 메소드를 언급하고있었습니다.
Ivan Pintar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.