2013-03-19 3 views
1

내 프로그램에서 파일 관리를 처리 할 수있는 개체를 만들려고합니다.구현 (확장) 경로

경로 인터페이스에는 필요한 거의 모든 메소드가 있지만 사용자 정의 코드를 추가하고 싶습니다. 객체에 Path를 구현하면 모든 경로의 메서드를 재정의해야합니다.

실제로 인터페이스의 메서드를 재정의하지 않고 Path 인터페이스의 모든 메서드와 몇 가지 추가 메서드가있는 개체를 만드는 방법이 있습니까?

길에서 Path 인터페이스를 확장하고 싶지만 추가 메서드 본문도 정의 할 수 있어야합니다.

+2

당신이'Path' 연장에서 무엇을 얻을 것인가? 대신 SimpleFileVisitor를 확장 한 것을 보았습니다. – Makoto

+1

경로를 확장하려는 이유를 설명해야합니다. 그렇게하지 않고도 목표를 달성 할 수있는 방법이있을 것입니다. –

답변

0

당신이 할 수있는 일은 Path 인터페이스를 구현하는 abstract 클래스를 만드는 것입니다. 이 클래스에서는 메서드를 구현하거나 구현되지 않은 상태로 유지하여 다른 클래스에서 처리 할 수 ​​있습니다. 그런 다음이 추상 클래스를 확장하고 원하는 모든 메서드를 재정 의하여 모든 단일 메서드를 재정의 할 필요가 없습니다. 예를 들어

:

public abstract class AbstractPath implements Path 
{ 
    //All methods declarations from Path interface 
} 

public class Base extends AbstractPath 
{ 
    //Override any method declared in AbstractPath 
} 
+1

그냥 'AbstractPath'까지 문제를 푸시합니다. OP는 모든 Path 메소드를 구현하거나 private 멤버'Path' 인스턴스에 위임해야합니다. –

+0

@ JimGarrison 내가 OP의 설명에서 이해 한 것은 이것이 그가 인터페이스의 몇 가지 메소드를 구현하고 자신의 메소드를 추가 할 수 있다는 것입니다. OP가 그가 원하는 것인지 말하지 않았다면 답을 왜곡 할 이유가 없습니다. –

1

나는 경로 인터페이스에 대한 몇 가지 작은 점에 대해 경고 할 수도 있습니다. 또한,이 인터페이스를 구현하기위한 두 가지 제안이 있습니다.

제 생각에 경로 인터페이스는 파일 연산자 개체의 경로에 대한 형식 참조 지점을 만드는 데 사용됩니다. Paths (경로 도우미 클래스)를 사용하여 경로를 만들 수 있습니다 (-s에주의하십시오). 그러나 어떤 클래스에서도 결코 구현되지 않습니다. 따라서 공통 유형 내에서 데이터를 전달하는 데 사용되는 인터페이스입니다. 즉, 코더는 경로 인터페이스를 유형으로 사용하여 정보를 전송 한 다음 경로 유형 객체를 수신하는 것으로 선언 된 다른 클래스 조작에서 경로 유형 객체를 사용합니다. 결과적으로 제 생각에는 경로 클래스를 구현하는 것이 꼭 필요한 것은 아닙니다.

내가 언급했듯이 다음 두 가지를 제안 할 수 있습니다. 이러한 유형의 사례는 좋은 디자인 결정이 아닙니다. 이 문제는 JavaSE7에서도 언급되었습니다. Doc : here

1) 먼저 인터페이스의 모든 메소드에 비헤이비어를 추가 할 필요가 없습니다. "구현되지 않은"msg 로그로 선언하고 null을 리턴 할 수 있습니다.

2) 그러나 더 좋은 방법은 Ali Alamiri가 언급 한 것처럼 추상 클래스를 사용하는 것입니다. 나는 개인적으로 추상을위한 서브 클래스를 만들고 단지 내가 원하는 메소드를 구현하는 데 소란스러워하지 않을 것이다. 더 많은 결함 허용 어플리케이션을 만들고 싶다면 서브 클래스를 사용하여 구현되지 않은 모든 메소드를 전달하고 모든 메소드에 대해 경고 msg 로그를 사용하십시오.

1

Decorator pattern을 사용할 수 있습니다.

예를 들어 BufferedReader을 기억하십니까? 그것은 당신의 경우와 매우 비슷합니다. 이것은 Reader 주변의 얇은 포장지 (꾸미기)로 버퍼링되며 몇 가지 추가 방법 (선을 읽을 수 있음)이 있습니다.

public class DecoratedPath implements Path { 
    private final Path path; 

    public DecoratedPath(Path path) { 
     this.path = path; 
    } 

    public DecoratedPath(String stringPath) { 
     this(Paths.get(stringPath)); 
    } 

    // add any additional constructors/factory methods you like 

    @Override 
    public int compareTo(Path other) { 
     return path.compareTo(other); 
    } 

    @Override 
    public int endsWith(Path other) { 
     return path.endsWith(other); 
    } 

    // Etc. for all the methods of the Path interface. 
    // They'll all delegate to the methods of the path field. 
    // You can also enhance some of them, if you want to, 
    // to return DecoratedPath instead of Path. 

    // your additional methods 
} 

사용법 :

DecoratedPath path = new DecoratedPath("/some/path"); 
+0

나는 당신이 누락 된 행동이 무엇인지 명시해야한다고 덧붙이고 싶습니다. 'Path' 인터페이스를 꾸밀 필요없이 그것을 구현할 수있는 방법이 있습니다. ['Files'] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html) 클래스를 보았습니까? 아니면 다양한 IO 라이브러리가 있습니까? –

+0

P. 위임 외에는 아무 것도하지 않는 많은 방법의 번거 로움을 극복하기 위해 롬복을 살펴볼 수 있습니다. 그것은 굉장. http://projectlombok.org/features/Delegate.html –