2009-04-25 8 views
3

추상 클래스는 오브젝트 패밀리에 유용하다고 (예 : 포유 동물의 동물에 사용될 수 있음) 설명되어 있습니다. 그러나 관련 객체의 패밀리를 나타내는 데 인터페이스 또는 추상 클래스를 사용하는 경우에는 어떤 차이가 있습니까?추상 클래스와 패밀리를 나타내는 인터페이스

내 프로세스는 일반적인 기능을 정의하고 미래의 확장을위한 옵션과 사용자 지정 기능 (구현)을위한 인터페이스를 사용하여 추상 클래스를 사용하는 것입니다.

예를 들어, 나는 직장에서 작은 웹 응용 프로그램에서 많이 사용될 일부 데이터베이스 기능을 캡슐화하기 위해 추상 클래스를 작성했습니다. 미래의 커스텀 기능으로 오버라이드 될 수있는 가상 메소드로 추상 클래스를 작성했습니다 (예 : 로깅 또는 필요할 수있는 데이터베이스 이벤트보고).

이것이 올바른 방법인가요? 가족을 나타 내기 위해 하나의 구조 (추상 또는 인터페이스)를 선택하는 데 중요한 의미가 있습니까?

+0

http://stackoverflow.com/questions/56867/interface-vs-base-class가이 질문에 답변합니까? 그렇다면 거짓말. – Gishu

+0

가능한 복제본 [추상 클래스 대신 인터페이스를 사용하고 그 반대의 경우?] (http://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract) -class-and-vice-versa) – nawfal

답변

3

모든 유형간에 공통된 상태와 동작이있는 경우 추상 클래스를 사용해야합니다. 인터페이스는 모든 유형이 공통 인터페이스를 갖지만 상태 또는 동작을 공유하지 않을 때 사용해야합니다.

다음은 예입니다.

독일 셰퍼드, 골든 리트리버, 비글

이 세 가지 오브젝트는 모든 개이며, 같은 그들은 공통된 상태 (등 육식, 네 다리를) 공유하고 그들은 또한 특정 공유 무시 무시한 행동 (나무 껍질, 바지 등). 이 경우에는이 공통 상태와 동작을 유지하고 개 유형별로 Dog의 하위 유형을 생성하는 추상 Dog 클래스를 만드는 것이 가장 좋습니다.

연필, 펜,

이러한 개체는 공통 상태가없는 분필 그들은 행동을 공유 할 수 없습니다. 그러나 그들은 공통점이 있다는 것을 알게 될 것입니다. 그들은 의 문자판 인입니다. 이러한 개체는 기본 클래스없이 별도로 빌드 한 다음 각 유형의 Write 메서드를 노출하는 Writable 인터페이스와 함께 묶어야합니다.

+0

내가 결정한 방식대로. 그러나 나는 그것을 받아 들인다. 당신이 준 지침을 준수하는 한 그들은 가족을 대표하는 것에 모두 적합하다. – dotnetdev

0

미래의 시점에서 데이터베이스 유틸리티에 새로운 기능을 구현할 수 있도록 인터페이스를 사용할 것을 제안합니다.

는 언제나처럼, 그것은 개발에 관해서 기본 설계 원칙 때 추상 클래스와 인터페이스를 향한

디자인이 아닌 구현

0

, 당신은 모든 필요한 및 공유 구현을 제공 할 수 있습니다 계층 구조의 클래스. 따라서 코드를 재사용하고 있습니다. 파생 클래스가 기본 동작을 재정의하도록 허용 할 수 있지만 최소한 태어난 새 동물을 호흡하는 것과 같은 기본 기능을 제공하고 있습니다. 그러나 인터페이스를 사용하면 구현을 제공 할 수 없습니다. 인터페이스를 상속하는 모든 클래스가이를 준수하고 구현해야하는 계약을 정의하기 만하면됩니다. 이로 인해 클래스 계층간에 반복적 인 중복 코드가 발생할 수 있습니다.

인터페이스는 확장성에별로 좋지 않으므로 버전 관리에 대해 걱정할 필요가 있습니다. 기존 인터페이스를 변경하기로 결정했으나 변경해야 할 클래스가 많이 있다는 것을 곧 깨닫게 될 것입니다. 많은 포유류가 이미 사용하고있는 IMammal 인터페이스에 브레스 메서드를 추가하는 것에 대해 생각해보십시오. 당신은 가서 각각에 브레스 구현을 제공해야합니다. 추상 클래스를 사용하면 숨겨진 메소드를 추가하고 기존 파생 클래스에 대해 걱정할 필요없이 기본 구현을 제공 할 수 있습니다. 따라서 추상 클래스는 계층 구조와 API의 개발 기간에서보다 유연합니다.

관련 문제