2011-04-29 4 views
16

추상 클래스에는 구체적이고 추상적 인 기능이 있습니다. 인터페이스에는 추상 기능 만 있습니다.추상 클래스보다 인터페이스의 장점은 무엇입니까?

두 가지 모두에서 대체가 가능합니다. 그것입니까

다른 하나의 실시간 이점은 무엇입니까?

+3

* one * 언어를 선택하십시오. 해당 답변 *은 다를 수 있습니다. –

+1

@Oli - 새로운 질문을 게시 할 것입니다 - OOP는 java, php, .net 등 다른 언어로 어떻게 다른가요? : – zod

+0

아니요. 질문이 너무 광범위하기 때문입니다. SO에 관한 질문은 * 구체적이어야합니다. –

답변

32

인터페이스는 "나는 당신이 어떻게하는지 신경 쓰지 않지만, 여기서 당신이해야 할 일이 무엇인지 말하고 싶습니다."

초급 수업은 "내가해야 할 일을 알고 있고, 어떤 경우에 어떻게해야하는지 잘 알고있다"고 말하고 싶을 때 사용됩니다.

추상 클래스에는 몇 가지 심각한 단점이 있습니다. 예를 들어 :

class House { 

} 

class Boat { 

} 

class HouseBoat extends /* Uh oh!! */ { 
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter 
} 

당신은 인터페이스를 통해를 통해 얻을 수 있습니다 :

interface Liveable { 

} 

interface Floatable { 

} 

class HouseBoat implements Liveable, Floatable { 

} 

지금, 추상 클래스도 매우 유용합니다. 예를 들어, AbstractCollection 클래스를 생각해보십시오. isEmpty()contains(Object)과 같이 매우 일반적인 메서드에 대한 모든 컬렉션에 대한 기본 동작을 정의합니다. 원하는 경우 이러한 동작을 재정의 할 수 있지만 컬렉션이 실제로 변경 될 가능성이 있는지 결정하기위한 동작은 무엇입니까? 일반적으로 size == 0이 될 것입니다.

그리고 자주 변경되지 않으므로 "해결 된"범주의 모든 메서드에 대해 해당 메서드를 구현하는 데 개발자가 시간을 투자 할 가치가 있습니까? 코드를 변경해야 할 때도 말할 것도없고 코드를 중복시키고 어디에서나 다시 구현해야하는 경우 버그가 누락 될 수 있습니다.

+2

중/대형 프로젝트에서 특정 모듈이 지원할 인터페이스에 동의하는 것도 도움이됩니다.다른 모듈에서 기대할 수있는 것을 알아야하며 다른 모듈은 모듈에서 기대할 수있는 아이디어를 가지고 있어야합니다. – user183037

+0

동의. 변화하는 구현에보다 쉽게 ​​적응할 수 있습니다. – corsiKa

+4

"+1 // lol at"// 헬리콥터 인 "Autoboathome"도 시작하지 마라. " – mellamokb

15

인터페이스는 Java가 다중 상속을 가지고 있지 않기 때문에 유용합니다 (그러나 원하는만큼의 인터페이스를 구현할 수 있습니다).

추상 클래스는 기본 클래스의 구체적인 동작이 필요할 때 유용합니다. 자바는 다중 상속을 지원하지 않기 때문에 그것은 단지 , 하나 개의 클래스 (추상 또는 콘크리트)를 연장 할 수있는 반면

1

클래스는 , 여러 인터페이스을 구현할 수있다.

0

인터페이스를 무시하지 마십시오. 그것을 구현합니다.

인터페이스를 작성하면 구현자가 기본 클래스에서 상속하는 것 외에도 인터페이스와 다른 인터페이스를 구현할 수 있습니다.

추상 클래스는 부분적으로 또는 완전히 구현 될 수 있습니다. 클래스 추상화를 표시하면 해당 유형의 객체를 인스턴스화 할 수 없게됩니다.

1

OOP (대부분 구체적인 언어와는 별도로)에서 추상 클래스는 자체적으로 완전하지 않은 동작 및 구조의 클래스 계층 구조에 대한 재사용 메커니즘입니다. 인터페이스는 구체적인 구현과 독립적으로 모듈 (예 : 클래스)에 대한 요구 사항을 지정하는 메커니즘입니다. 다른 모든 차이점은 기술적 인 세부 사항이며, 다른 용도는 중요합니다.어떤 구현없이

0

-Method는 생성자, 인스턴스와 정적 블록을 가질 수있는 완전 추상, 다음은 추상 클래스

- 인터페이스로 선언해야 클래스가 하나 이상의 추상 메소드를 포함 할 때마다 추상적 인 방법이다 두 가지 유형의 멤버 만 포함합니다. 1. 공용 추상 메서드 2. public-final-final 변수

* 둘 다 인스턴스화 할 수 없지만 참조를 만들 수 있습니다.

* 어느 쪽이 더 적합합니까? - 자바 클래스는 다중 상속을 지원하지 않지만 인터페이스는 유용하기 때문에 인터페이스가 유용합니다.

-Abstract 클래스는 기본 클래스의 구체적인 동작이 필요할 때 유용합니다.

0

추상 클래스보다 인터페이스의 주된 이점은 다이아몬드 문제를 극복하고 다중 상속을 달성하는 것입니다. 자바에서는 클래스를 사용하는 다이아몬드 문제에 대한 해결책이 제공되지 않습니다. 이러한 이유 때문에 다중 상속은 java 클래스를 사용하는 블록입니다. 그래서 다중 상속을 달성하기 위해 우리는 인터페이스를 사용합니다.

2

사실은

  1. 자바
  2. 다중 인터페이스는

이러한 사실이 있습니다 구현 될 수있는 추상 클래스에

  • 몇 가지 방법을 구현할 수있다 다중 상속을 지원하지 않습니다 입었네 인터페이스 또는 추상 클래스에 유리하게 이점을 기울이는 데 사용할 수 있습니다.

    클래스가 다른 클래스와 공유해야하는 동작이 여러 개있는 경우 인터페이스가 이깁니다. 메서드 정의를 다른 클래스와 공유/재정의해야하는 경우 추상 클래스가 우선적으로 적용됩니다.

  • 0
    class Animal 
    { void move(){} } 
    
    class Bird 
    { void move(){fly} } 
    
    class Fish 
    { void move(){swim} } 
    

    이제 클래스 동물 여기

    Animal a; 
    
    a= new Bird(); or a = new Fish() 
    

    같은 추상 클래스는, 추상화가 잘 작동하지만, Animal a[100] 같은 100 개체가있는 경우의 경우는

    당신은 new Bird().move 또는 new Fish().move 100 배

    를 사용하여 인터페이스를 작성하고 a[i].move을 쓸 수 없습니다. 그것은 새 또는 물고기로 분화 할 것이고 move()이 호출 될 것입니다.

    둘째로 많은 수의 인터페이스를 구현할 수있는 클래스 인 A이 다중 상속을 지원합니다.

    관련 문제