[oop] 인터페이스 대베이스 클래스

언제 인터페이스를 사용해야하고 기본 클래스를 언제 사용해야합니까?

메소드의 기본 구현을 실제로 정의하지 않으려면 항상 인터페이스 여야합니까?

개와 고양이 수업이 있다면. PetBase 대신 IPet을 구현하고 싶은 이유는 무엇입니까? 애완 동물을 기준으로 애완 동물에 배치 할 수 있기 때문에 ISheds 또는 IBarks (IMakesNoise?)에 대한 인터페이스가 있음을 이해할 수 있지만 일반 애완 동물에 사용할 인터페이스를 이해하지 못합니다.



답변

Dog 및 Cat 클래스의 예를 들어보고 C #을 사용하여 설명하겠습니다.

개와 고양이는 모두 동물, 특히 사족 포유류입니다 (동물은 너무 일반적입니다). 둘 다 추상 클래스 Mammal이 있다고 가정합니다.

public abstract class Mammal

이 기본 클래스에는 다음과 같은 기본 메소드가있을 것입니다.

  • 먹이다
  • 항해사

이들 모두는 어느 한 종 사이에서 거의 동일한 구현을 갖는 행동입니다. 이것을 정의하려면 다음이 필요합니다.

public class Dog : Mammal
public class Cat : Mammal

이제 우리가 보통 동물원에서 볼 수있는 다른 포유류가 있다고 가정 해 봅시다.

public class Giraffe : Mammal
public class Rhinoceros : Mammal
public class Hippopotamus : Mammal

기능의 핵심에서 여전히 유효 Feed()하며 Mate()여전히 동일 하기 때문에 이것은 여전히 ​​유효합니다 .

그러나 기린, 코뿔소, 하마는 애완 동물을 만들 수있는 동물이 아닙니다. 인터페이스가 유용한 곳입니다.

public interface IPettable
{
    IList<Trick> Tricks{get; set;}
    void Bathe();
    void Train(Trick t);
}

위 계약의 이행은 고양이와 개 사이에서 동일하지 않습니다. 상속을 위해 추상 클래스에 구현을 배치하는 것은 나쁜 생각입니다.

개와 고양이의 정의는 이제 다음과 같아야합니다.

public class Dog : Mammal, IPettable
public class Cat : Mammal, IPettable

이론적으로 상위 기본 클래스에서 재정의 할 수 있지만 기본적으로 인터페이스를 사용하면 상속 할 필요없이 클래스에 필요한 항목 만 추가 할 수 있습니다.

결과적으로 일반적으로 하나의 추상 클래스 (대부분 정적으로 유형이 지정된 OO 언어에서 예외는 C ++ 포함)에서만 상속 할 수 있지만 여러 인터페이스를 구현할 수 있기 때문에 필요한만큼 엄격하게 객체를 구성 할 수 있습니다 .


답변

Josh Bloch는 Effective Java 2d 에서 자신을 말했습니다 .

추상 클래스보다 인터페이스 선호

몇 가지 주요 사항 :

  • 기존 클래스를 쉽게 개조하여 새로운 인터페이스를 구현할 수 있습니다 . 필요한 메소드가 아직 없으면 추가하고 클래스 선언에 구현 절을 추가하기 만하면됩니다.

  • 인터페이스는 믹스 인을 정의하는 데 이상적입니다 . 느슨하게 말해서, 믹스 인은 클래스가“기본 유형”외에 구현할 수있는 유형으로, 선택적인 동작을 제공한다고 선언합니다. 예를 들어 Comparable은 클래스가 서로 비교 가능한 다른 객체와 관련하여 해당 인스턴스의 순서를 선언 할 수있는 mixin 인터페이스입니다.

  • 인터페이스를 통해 비 계층 형식 프레임 워크를 구성 할 수 있습니다. 유형 계층 구조는 어떤 것을 구성하는 데 유용하지만 다른 것은 깔끔한 계층 구조로 깔끔하게 분류되지 않습니다.

  • 인터페이스 는 랩퍼 클래스 관용구를 통해 안전하고 강력한 기능 향상가능하게합니다 . 추상 클래스를 사용하여 유형을 정의하는 경우 대체 기능없이 기능을 추가하려는 프로그래머가 상속을 사용하지 않아도됩니다.

또한 추상 스켈 레탈 구현 클래스를 제공하여 내보내는 각각의 중요하지 않은 인터페이스와 함께 인터페이스와 추상 클래스의 장점을 결합 할 수 있습니다.

반면에 인터페이스는 진화하기가 매우 어렵습니다. 인터페이스에 메소드를 추가하면 모든 구현이 중단됩니다.

추신. : 책을 구입하십시오. 훨씬 더 자세합니다.


답변

인터페이스와 기본 클래스는 서로 다른 두 가지 형태의 관계를 나타냅니다.

상속 (기본 클래스)은 “is-a”관계를 나타냅니다. 예를 들어 개 또는 고양이 “is-a”애완 동물. 이 관계는 항상 “단일 책임 원칙” 과 함께 클래스 의 (단일) 목적 을 나타냅니다 .

반면에 인터페이스 는 클래스의 추가 기능 을 나타냅니다 . ” Foois disposable” 과 같이 “is”관계라고 부르 므로 IDisposableC # 의 인터페이스입니다.


답변

현대적인 스타일은 IPet PetBase 를 정의하는 것입니다.

인터페이스의 장점은 다른 코드가 다른 실행 코드와 아무 관련없이 사용할 수 있다는 것입니다. 완전히 “깨끗합니다.” 또한 인터페이스를 혼합 할 수 있습니다.

그러나 기본 클래스는 간단한 구현 및 공통 유틸리티에 유용합니다. 따라서 시간과 코드를 절약하기 위해 추상 기본 클래스를 제공하십시오.


답변

인터페이스

  • 두 모듈 간의 계약을 정의합니다. 구현할 수 없습니다.
  • 대부분의 언어를 사용하면 여러 인터페이스를 구현할 수 있습니다
  • 인터페이스 수정은 주요 변경 사항입니다. 모든 구현을 다시 컴파일 / 수정해야합니다.
  • 모든 회원은 공개됩니다. 구현은 모든 멤버를 구현해야합니다.
  • 인터페이스는 디커플링에 도움이됩니다. 모의 프레임 워크를 사용하여 인터페이스 뒤의 모든 것을 모의 할 수 있습니다.
  • 인터페이스는 일반적으로 일종의 동작을 나타냅니다.
  • 인터페이스 구현은 서로 분리 / 분리

기본 수업

  • 파생을 통해 무료로 제공되는 기본 구현 을 추가 할 수 있습니다
  • C ++를 제외하고 하나의 클래스에서만 파생 될 수 있습니다. 여러 클래스에서 가능하더라도 일반적으로 나쁜 생각입니다.
  • 기본 클래스를 변경하는 것은 비교적 쉽습니다. 파생물은 특별한 것을 할 필요가 없습니다.
  • 기본 클래스는 파생으로 액세스 할 수있는 보호 된 공용 함수를 선언 할 수 있습니다.
  • 인터페이스처럼 추상 기본 클래스를 쉽게 조롱 할 수 없습니다
  • 기본 클래스는 일반적으로 유형 계층 구조를 나타냅니다 (IS A)
  • 클래스 파생은 일부 기본 동작 (부모 구현에 대한 복잡한 지식이 있음)에 따라 달라질 수 있습니다. 한 사람의 기본 구현을 변경하고 다른 사람을 중단하면 문제가 발생할 수 있습니다.

답변

일반적으로 추상 클래스보다 인터페이스를 선호해야합니다. 추상 클래스를 사용하는 한 가지 이유는 구체적인 클래스간에 공통 구현이있는 것입니다. 물론 여전히 인터페이스 (IPet)를 선언하고 해당 인터페이스를 구현하는 추상 클래스 (PetBase)가 있어야합니다. 인터페이스는 경계를 넘어서 유형의 유연성과 이식성을 극대화합니다. 경계를 넘어 참조를 전달할 때는 항상 콘크리트 유형이 아닌 인터페이스를 전달하십시오. 이를 통해 수신 측에서 구체적인 구현을 결정하고 최대한의 유연성을 제공합니다. 이것은 TDD / BDD 방식으로 프로그래밍 할 때 절대적으로 적용됩니다.

Gang of Four는 자신의 저서에서 “상속은 서브 클래스가 부모의 구현에 대한 세부 사항에 노출되기 때문에 종종”상속이 캡슐화를 깨뜨린 다 “고 말합니다. 나는 이것이 사실이라고 믿는다.


답변

이것은 .NET에 따라 다르지만 Framework Design Guidelines 책은 일반적인 클래스에서 진화하는 프레임 워크에서 더 많은 유연성을 제공한다고 주장합니다. 인터페이스가 제공되면 해당 인터페이스를 사용하는 코드를 깨지 않고도 인터페이스를 변경할 수 없습니다. 그러나 클래스를 사용하면 클래스를 수정하고 링크 된 코드를 중단하지 않아도됩니다. 새로운 기능 추가를 포함하여 올바른 수정을하면 코드를 확장하고 발전시킬 수 있습니다.

Krzysztof Cwalina는 81 페이지에 말합니다.

.NET Framework의 세 가지 버전을 통해이 가이드 라인에 대해 팀의 많은 개발자와 이야기했습니다. 처음에 지침에 동의하지 않은 사람들을 포함하여 많은 사람들은 인터페이스로 일부 API를 제공 한 것을 후회한다고 말했습니다. 누군가가 수업을 보낸 것을 후회 한 사례조차 들어 본 적이 없습니다.

거기에는 분명히 인터페이스의 장소가 있습니다. 일반적인 지침으로 인터페이스를 구현하는 방법의 예로서 다른 방법이 없다면 항상 인터페이스의 추상 기본 클래스 구현을 제공하십시오. 가장 좋은 경우에 기본 클래스는 많은 작업을 절약 할 수 있습니다.