2014-09-16 7 views
1

추상 클래스의 메서드 내용을 수정하거나 확장 할 수 있습니까?추상 메서드 수정

public abstract class MainClass{ 
    public void func(){ 
     // content... 
    } 
} 

public class FirstClass extends MainClass{ 
    public void func(){ 
     // content from MainClass 
     // own content 
    } 
} 
public class SecondClass extends MainClass{ 
    public void func(){ 
     // content from MainClass 
     // other content 
    } 
} 

나는 그러나 작은 수정과, 두 클래스의 방법 func이 필요합니다.

+2

'abstract' 메소드에는 정의에 의해 "content"가 없습니다. –

+2

게시하기 전에 코드를 컴파일하려고 시도 했습니까 – sol4me

+0

@SotiriosDelimanolis : Ok, edited. – user1170330

답변

1

다음 : 추상적 인 방법은 시체가없는 것처럼

public abstract void func(){ 
    // content... 
} 

이 존재할 수 없습니다. 본문이있는 추상 메서드가있는 경우 컴파일 타임 오류가 발생합니다.

그러나, 당신은 항상 call the superclass method 할 수 있습니다

public class MainClass{ 
    public void func(){ 
     // base content... 
    } 
} 

public class FirstClass extends MainClass{ 
    public void func(){ 
     super.func(); 
     // own content 
    } 
} 
public class SecondClass extends MainClass{ 
    public void func(){ 
     super.func(); 
     // other content 
    } 
} 
+0

이 경우'MainClass'의 전체 메소드가 실행됩니다. 실행하기 전에 메소드의 일부분을 먼저 수정해야합니다. – user1170330

+2

@ user1170330 원래 게시물에 제공된 코드 샘플과 일치하지 않습니다. 수퍼 클래스 메소드를 분해하고이를 부분적으로 호출하지 않고는 불가능합니다. – hexafraction

+0

질문의 코드에 추상 메서드가 없습니다. –

0

수정하거나 방법의 내용에 상관없이 추상 클래스 또는하지를 확장 할 수 없습니다. 메소드를 재정의 할 수 있습니다. 즉, 새 메소드 구현을 제공 할 수 있습니다. super 키워드 : super.originalMethod()을 사용하여 부모 클래스에서 "원본"메서드를 호출 할 수도 있습니다.

1

템플릿 메서드 패턴을 사용하는 것이 흥미로울 것이라고 생각합니다. 아마 당신의 문제를 해결할 것입니다.

public abstract class MainClass { 

    public final void sharingcode() { 
     // content from MainClass 
     // write here the common code 

     concreteCode(); // Calling abstract method to be implemented by implementations 
    } 

    protected abstract void concreteCode(); 

    public class FirstClass extends MainClass { 

     @Override 
     public void concreteCode() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

    } 

    public class SecondClass extends MainClass { 

     @Override 
     public void concreteCode() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

    } 
} 
+0

템플릿 메서드 패턴이 super를 호출하는 것보다 더 바람직하다고 생각합니다. 이 패턴을 사용하면 확장 클래스는 super를 호출하는 것을 기억하거나 잊어 버릴 필요조차 없습니다. – jrahhali

0

http://en.wikipedia.org/wiki/Template_method_pattern

나는 에세 키엘 여기에 가장 좋은 대답이라고 생각하지만, 또 다른 옵션으로 전략 패턴을 제시하고 싶었다. 당신은 기본적으로 서브 클래 싱을하지 않고 MainClass에 행동의 차이점을 삽입해야합니다 :

public abstract class MainClass{ 
    private final Behaviour behaviour; 

    public MainClass(Behaviour behaviour) { 
     this.behaviour = behaviour; 
    } 

    public void func(){ 
     // content... 
     behaviour.execute(); 
    } 
} 

public interface Behaviour { 
    void execute(); 
}