인터페이스를 직접 구현해야합니까 아니면 슈퍼 클래스에서 수행해야합니까?


14

차이점이 있습니까?

public class A extends AbstractB implements C
{...}

대...

public class A extends AbstractB
{...}
abstract class AbstractB implements C
{...}

두 경우 모두 클래스 A가 인터페이스를 준수한다는 것을 이해합니다. 두 번째 경우에는의 AbstractB인터페이스 메소드에 대한 구현을 제공 할 수 있습니다 C. 그게 유일한 차이점인가요?

나는의 인터페이스 방법 중 하나에 대한 구현을 제공하지 않으려면 AbstractB , 내가 사용해야 스타일을 ? 하나 또는 다른 하나를 사용하는 데 숨겨진 '문서'목적이 있습니까?


3
제목을 제안 : 나는 슈퍼 클래스가 그것을 할 수있는 인터페이스를 직접 구현하거나이 있어야
쟌느 Boyarsky

답변:


20

AbstractB implements C의미 론적으로 모든 것이 달려 있습니다 . 즉, 의미 적 AbstractB으로 구현 하는 것이 의미가 있다면 C가십시오.

구체적인 예를 들어 보면 의미 차이가 분명해집니다.

A = Dog 인 경우 AbstractB = Animal, C = IBark

말이되는 유일한 선택은

class Dog extends Animal implements IBark{

이것은 모든 동물이 짖는 것을 의미하기 때문에 의미가 없습니다.

class Animal implements IBark{

class A에서 상속하는 것 이상을 가진 경우 다른 차이점이 적용됩니다 AbstractB. # 1에서는 C를 구현할 필요가없고 # 2에서는 모두 C를 구현해야합니다.


1
+1 내 대답보다 훨씬 더 명확합니다!
Hand-E-Food

또한 인터페이스가 Heterotroph적절 하다면 Animal구현 하는 것이 합리적 Heterotroph입니다. 다른 짖는 동물을 많이 기대하고 같은 방식으로 그들을 치료하고 싶다면 다른 수업 BarkingAnimal extends Animal implements IBark이 갈 것입니다.
scarfridge

@scarfridge 사실 나는 동물이 확장되기를 기대 Heterotroph하지만 여러분의 의견에 감사드립니다
Karthik T

2

적절한 상속 관계를 결정하는 쉬운 방법은 클래스 자체를 보는 것이 아니라 해당 클래스에서 메서드 를 호출 하는 코드를 보는 것입니다 . 어딘가에 코드에서 당신은 같은 것을 가지고 AbstractB b = new A();otherObject.addAbstractB(this);. 어느 쪽이든 나중에 해당 AbstractB참조를 사용하여 다양한 메소드 호출을합니다.

이 상황에서의 메소드를 호출하고 싶 C습니까? 그렇다면 AbstractB을 구현해야합니다 C. 그렇지 않다면해서는 안됩니다. 그런 상황이 없다면 상속이 필요하지 않으며 컴포지션이 훨씬 느슨하기 때문에 대신 컴포지션을 사용하도록 리팩터링해야합니다.


2

"숨겨진"문서화 목적이 아닙니다. AbstractB와 모든 서브 클래스를 C로 캐스트 할 수 있습니다. 실제로 세 가지 스타일이 있습니다.

public class A extends AbstractB implements C
public class AbstractB

AbstractB가 논리적으로 C를 구현하지 않은 경우 이것을 사용합니다. 메소드를 제공하지 않더라도 의미가있을 수 있습니다. Dog와 같은 Animal은 Wag를 구현합니다. 모든 동물이 Wag하는 것은 이치에 맞지 않습니다. 이 접근법은 AbstractB가 구현을 제공하는 것을 실제로 배제하지는 않습니다.

public class A extends AbstractB
public AbstractB implements C

모든 서브 클래스가 인터페이스를 구현하기를 원하고 모든 서브 클래스가 그렇게하는 것이 합리적이라면 이것을 사용합니다. Beagle과 같은 AbstractDog는 Wag를 구현합니다.

public class A extends AbstractB implements C
public class AbstractB implements C

이것은 중복되지만 명확성을 더할 수 있습니다.


두 번째 단락의 "AbstractC"(질문에는 존재하지 않음)를 "AbstractB"로 변경해야한다고 생각합니다. 에디 스트는 6 자 이상이어야하므로 편집 할 수 없습니다.
cellepo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.