2009-12-08 8 views
3

는이 같은 일부 코드가있어 :내 공장에 문제가 있습니까?

public abstract class Foo { 
    public static Foo getFoo() { 
     return new FooImpl(); 
    } 

    abstract void DoFoo(); 

    private class FooImpl extends Foo { 
     public FooImpl() { } 

     @Override 
     void DoFoo() { } 
    } 
} 

을하지만, Eclipse는 No enclosing instance of type Foo is accessible. 그래서 어떻게이 작업을 얻을 수 말해입니까?

public abstract class Foo { 
    public static Foo getFoo() { 
     return new FooImpl(); 
    } 

    private static class FooImpl extends Foo { 
     public FooImpl() { } 
    } 
} 

을 그리고 난 여전히 같은 오류가 발생합니다 :

나는 그것을 컴파일 것입니다 있는지 확인하기 위해 가능한 한 간단하게하려고했습니다. 내가 뭘 놓치고 있니?

고정! 나는 return new Foo.FooImpl();

+1

public Foo getFoo()는 public static Foo getFoo() 여야합니다. 오타가 추측되는 것은 오류 일 뿐이며 getFoo는 정적입니다. –

+0

네, 맞습니다. – jasonh

답변

9

우수한 설명 here에 선 return new FooImpl();을 변경 - 짧은에, 당신은 클래스에게 FooImplstatic을 내리는 데 필요한, 그래서 그것은 단지 (안 외부 클래스의 특정 예를에, 외부 클래스에 묶여있는 당신을 가지고 있지 않다). getFoo 메소드도 정적이어야합니다. 그렇지 않으면 무엇이 인스턴스Foo입니까?

+0

연결 팩토리에서 이것을 사용할 것입니다. 기본적으로 패키지 소비자는 그들이 요구하는 연결을 구현하는 구체적인 클래스를 결코 알 수 없습니다. 따라서 Connection 클래스에서 abstract가 될'connect()','disconnect()'및 so-on 메소드가있을 것이고 각 구현은 구체적인 구현을 제공 할 책임이있다. – jasonh

2

어떻게 사람들에게 getFoo()으로 전화 하시겠습니까?

완전히 펑키하고 급진적 인 것을하지 않는 한, static으로 설정해야합니다.

1

FooImpl 클래스를 static으로 만들면 작동합니다.

관련 문제