2009-12-08 40 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 FooImpl();return new Foo.FooImpl();

+1

public Foo getFoo()應該是public static Foo getFoo()。 猜測一個錯誤只出現在錯誤中,並且getFoo是靜態的。 – 2009-12-08 02:32:41

+0

是的,你是對的。 – jasonh 2009-12-08 02:38:50

回答

9

優秀解釋here - 簡單地說,你需要做的類FooImplstatic,所以它只能依賴於外部類,而不是外部類的特定實例(你沒有)。 getFoo方法也看起來應該是靜態的,順便說一句 - 否則,實例Foo你計劃打電話嗎?

+0

我將在連接工廠中使用它。基本上,包的使用者不應該知道實現他們要求的連接的具體類。因此會有'connect()'''disconnect()'等方法,這些方法在Connection類中是抽象的,每個實現都負責提供具體的實現。 – jasonh 2009-12-08 02:34:44

2

你打算如何打電話給getFoo()

除非你正在做一些完全時髦和激進的事情,否則你需要製作它static

1

使FooImplstatic它會工作。