추상 클래스가 있고이 클래스에 추상 메소드 만 있다고 가정 해 봅시다. 이 추상 클래스는 메소드가 동일한 인터페이스와 다른가?
내가 알고 싶은 것은 추상적 멤버와 동등한 인터페이스를 가진 추상 클래스 간의 철학적, 객관적 및 기본 프로그래밍 언어 구현에 차이점이 있는지 여부입니다.
추상 클래스가 있고이 클래스에 추상 메소드 만 있다고 가정 해 봅시다. 이 추상 클래스는 메소드가 동일한 인터페이스와 다른가?
내가 알고 싶은 것은 추상적 멤버와 동등한 인터페이스를 가진 추상 클래스 간의 철학적, 객관적 및 기본 프로그래밍 언어 구현에 차이점이 있는지 여부입니다.
답변:
기술적으로 차이점은 실제로 중요하지 않지만 개념 상으로는 완전히 다른 것이므로 다른 사람들이 언급 한 기술적 차이로 이어집니다.
추상 수퍼 클래스는 정확히 들리는 것과 같으며, 고양이와 개는 동물과 같은 다른 많은 유형과 공유되는 공통 유형입니다.
인터페이스는 또한 소리처럼 들리며, 다른 클래스가 객체와 통신 할 수있는 인터페이스입니다. Cat Walk를 만들고 싶다면 Cat에서 CanWalk 인터페이스를 구현해야합니다. 그들은 매우 다르게 걷는 도마뱀도 마찬가지입니다. 반면에 뱀은 CanWalk를 구현하지 않으므로 Walk에게 말할 수 없습니다. 한편, Lizard와 Snake (또는 더 명백한 서브 클래스-전문가가 아님)는 모두 피부를 깎아내어 CanShed를 구현할 수 있지만 Cat은 그렇게 할 수 없습니다.
그러나 그들은 모두 여전히 동물이며 살아 있는지 또는 죽은 지와 같은 일반적인 속성을 가지고 있습니다.
이것이 인터페이스의 모든 메소드가 공용으로 (또는 C #에서 명시 적으로) 구현되어야하는 이유입니다. 클래스와 객체 사이의 인터페이스에서 숨겨진 인터페이스의 요점은 무엇입니까? 언어가 다중 상속을 지원하지 않는 경우에도 객체에 대한 여러 인터페이스를 가질 수있는 이유이기도합니다.
당신의 질문으로 돌아가서, 이런 식으로 볼 때, 완전히 추상적 인 수퍼 클래스를 가질 이유는 거의 없습니다.
대부분의 OOP 언어에서 구현 클래스는 하나의 추상 클래스에서만 파생 될 수 있지만 여러 인터페이스를 구현할 수 있습니다.
다중 상속을 허용하고 인터페이스가없는 C ++와 같은 언어에서 모든 메소드가 추상적 인 추상 클래스는 인터페이스로 사용할 수 있습니다. 나는 C ++로 그다지 많은 일을하지 않았지만 기본 클래스에 동일한 이름을 가진 메소드가있을 때 다중 상속이 문제를 일으킬 수 있다고 생각합니다.
PHP와 C #과 같은 언어에서 인터페이스는 유사한 다형성을 달성하는 수단을 제공하지만 추상 클래스 상속과 인터페이스 구현 사이에는 개념적 차이가 있으므로 "상속"이라고하는 것을 싫어합니다. 인터페이스 자체는 구현을 제공하지 않기 때문에 충돌 문제를 제거합니다.
인터페이스는 외부 세계와의 계약 역할을하지만 추상 클래스는 구현을 제공 할 수 있지만 인터페이스를 "가짜"로 사용하더라도 구현하지 않을 수 있습니다.
개념 상 주요 차이점은 클래스가 다른 클래스를 상속 할 때 (추상적이든 아니든) "is"의 관계가 있으므로 a Car
는 a Vehicle
와 Dog
a라는 것 Animal
입니다. 인터페이스를 사용하면 객체가 중요한 일을합니다. 모두 그렇게 Car
하고 Dog
있습니다 Move()
그들이 구현하기 때문에 소비자는 그것을 알고 Movable
있지만, 자동차는 확실히 아니다 Dog
, 나 Animal
. 그리고 이동 구현은 다르지만 (바퀴와 다리는 다름) 소비 코드는 중요하지 않습니다. 인터페이스는 구현이 아니라 소비 코드에 관한 것입니다.
주요 요점은 원하는 언어로 된 인터페이스가 있다면 인터페이스를 사용하는 것입니다. 그렇지 않은 경우 (C ++ 에서처럼) 순수 추상 클래스를 사용하여 위조 할 수 있습니다.
Dog
하고 Cat
있습니다 .
추상 클래스에는 추상 보호 메소드가 있습니다 (작업중 인 언어로). 인터페이스 메소드는 일반적으로 공개입니다. 이 차이가 유용한 착취를 허용하는지 여부는 모르겠습니다.
편집 먼저 개인 추상 메소드를 사용할 필요가 없다고 생각했지만 이제는 해당 메소드가 호출되지 않도록하는 데 사용될 수 있음을 상기했습니다. 이렇게하면 객체의 복사 생성자가 호출되는 것을 방지 할 수 있습니다.
주요 차이점은 다음과 같습니다. 추상 클래스에서-모든 메소드가 모두 추상적이더라도 데이터 멤버 (인스턴스 변수)와이를 구현하는 클래스에 일부 코드 (개인 메소드 또는 생성자 형식)를 제공 할 수 있습니다. 정적 블록; 하위 클래스 작업의 일부를 수행하고 구현에 도움을줍니다.
한 가지 긍정적 인 부작용 : 코드가 한 곳에 있으므로 한 곳에서 수정해야합니다. 하위 클래스는 수퍼 클래스 메소드를 호출 한 다음 수퍼 클래스 조치로 충분하다면 다른 것을하거나 아무것도하지 않을 수 있습니다. 수퍼 클래스는 각 하위 클래스 가이 결정을 내리기를 원하므로 모든 구현을 추상으로 표시했습니다 (일부도 비어있을 수 있음)
질문과 관련이 없지만 인터페이스가 있다는 것은 하나의 클래스가 두 개의 다른 계약을 구현할 수 있음을 의미합니다. 이것이 추상 수퍼 클래스에 비해 인터페이스의 이점입니다