2013-07-22 8 views
0

100 번 요청되었지만 모두 다른 답변이 있습니다. 그래서 저는이 질문을 다시 던졌습니다. 우리가 모든 추상 메소드를 인터페이스 할 수없는 이유는 무엇입니까?추상 메서드 대 인터페이스 메서드

나는 추상적 인 방법을 사용하여 구현할 수있는 템플릿 패턴을 알고 있지만 인터페이스를 사용하여 수행 할 수있는 템플릿 패턴이 있다는 것을 알고 있습니다. 그렇다면 왜 추상 메소드를 사용해야할까요? 오늘 나는 이것에 대해 읽고 답을 찾으려고 노력하고 있습니다.

미리 감사드립니다.

답변

2

인터페이스는 객체에 대해 공개 계약을 정의합니다. 외부 호출자가 메소드를 호출 할 수 없기 때문에 템플릿 패턴을 사용할 때 Java 메소드의 protected 메소드를 자주 사용합니다.

인터페이스가 필요하지 않을 수도 있습니다. 당신은 무엇을

abstract class MyClass { 
    someConreteMethod() { ... } 
    abstract someAbstractMethod(); 
} 

아마 당신은 내가 자주 공공 추상적 인 방법을 사용하지 않는, MyClass의 구현은 일반적으로 추상적 MyClass

을 확장하고 싶지만, 같은 뭔가가 있다면 비공개 것들을 가지고 훨씬 더 보편적입니다.

+0

감사합니다 (구현에 의해 오버라이드 (override)이 끊긴 부하하는) 일부 결승전 방법 (당신이 변경하려는 해달라고 로직)와 추상 메소드와 추상 클래스로 만든 템플릿은, 거기에 의미가 있습니다. 하지만 두 번째 예제에서는 공용 로직에 대한 기본 클래스를 만들 수 있으며 public 일 경우 someabstract 메소드에 대한 인터페이스를 작성할 수 있습니다. 공용 추상 메서드는 인터페이스로 이동해야합니까? 또한 기본 클래스는 추상 추상해야합니다 대부분의 시간. – snail

+0

@jeff good point – Brad

+0

인터페이스에는 의미가 있습니다. 인터페이스로 개체를 참조 할 수 있기를 원합니다. MyClass를 확장하지 않는 구현을 여러 개 가지기를 원하지 않는다면 인터페이스는 이해가되지 않을 것이다. 때로는 단지 판결 요청 일뿐입니다. 덕분에 –

1

이미 알고 있다고 가정하고 있지만 인터페이스는 구현자가 모든 메소드를 덮어 쓸 것을 요구합니다. 추상 클래스는 그렇지 않습니다. 이것이 유용한 이유는 그 추상 클래스를 확장하는 모든 클래스에 하나의 메소드 구현을 제공하고자 할 수 있기 때문입니다.

일반의 예는

abstract class Person{ 

public void pumpBlood(){ 
//do blood pumping stuff 
} 

public void talk(); 
public void getDressed(Clothes someClothes); 
} 

모든 사람들이 (이론) 같은 방법으로 혈액을 펌프해야 Person 클래스를 할 수 있지만, 모든해야 getDressed 또는 같은 방식으로 이야기 할 수도 있습니다. 추상 클래스는 구체적인 메소드가 제공 될 수있는 상황에 유용합니다.

+0

Brad에게 감사드립니다. 제 질문은 추상적 인 "방법"에 관한 것입니다. 추상 클래스에서는 구현되지 않으므로 인터페이스로 이동하지 않는 것이 좋습니다. 또한 이것은 인터페이스에 대한 프로그램이라고도합니다. 모든 추상 "메소드"를 인터페이스로 옮기고 기본 로직이나 추상 클래스에 공통 논리를 유지하는 것이 옳지 않다고 생각합니다. – snail

+0

당신을 오해. – Brad

1

이것은 템플릿 메서드 패턴의 예입니다. , 템플릿 예를 들어

public abstract class HtmlTemplate { 

    /** 
    * Get html code. 
    * Its final, so nobody can override. 
    * @return Html code. 
    */ 
    public final String getHtml() { 
     String html = "<html>" 
       + "<head>" 
       + getHead() // abstract method 
       + "</head>" 
       + "<body>" 
       + getBody() // abstract method 
       + "</body>" 
       + "</html>"; 
     return html; 

    } 

    /** 
    * Get head implementation. 
    * @return head code 
    */ 
    protected abstract String getHead(); 

    /** 
    * Get body implementation. 
    * @return body code 
    */ 
    protected abstract String getBody() ; 
} 

public class MyHtmlPageImpl extends HtmlTemplate { 

    @Override 
    protected String getHead() { 
     return "<title>My page</title>"; 
    } 

    @Override 
    protected String getBody() { 
     return "Hello world"; 
    } 
} 
+0

감사합니다. HTML보기와 다른보기입니다. – snail