2012-01-12 93 views
0

我有幾個隊列都延伸Queue類。我想做一個隊列管理器基類來處理添加到隊列(和其他操作)。如何解決抽象靜態方法設計問題?

如果你看看下面的代碼,我創建了一個名爲QueueManger的基類,它有一個名爲add()的靜態方法,它將得到'隊列'並向其中添加一個變量。我想讓getQueue()(在add()中調用)抽象,因爲我想強制其他類提供它們自己的'Queue'實現。問題是我無法聲明抽象的靜態方法。什麼是解決這個問題的正確方法?

public class RegistrationQueueManger { 
    @Override 
    Queue getQueue() { 
     return new RegistrationQueue(); // RegistrationQueue is a class that 
             // extends Queue.java 
    } 
} 

public abstract class QueueManger { 
    abstract static Queue getQueue(); // Error: cant do! (in java) 

    public static Add(String myvar) { 
     getQueue().add(myvar); 
    } 
} 

注:我看到了有關這個問題的一些問題,但它並沒有真正給出如何解決它,並創建另一個設計處理它一個很好的答案。

+0

閱讀下面的答案,而如果他想延長的QueueManager使用Singleton模式,而不是你的代碼 – 2012-01-12 17:03:17

+1

的,它不應該是靜態的還是單身。 – Robin 2012-01-12 17:34:28

+0

對,使RegistrationQueueManger成爲一個單身人士呢?是對的嗎。 – Jimmy 2012-01-12 22:00:51

回答

3

只有實例方法可能被覆蓋。所以抽象靜態方法是沒有意義的。方法getQueue不應該是靜態的,並且add方法也不應該是靜態的。

1

這是因爲抽象方法必須被重寫(實現)並且靜態方法不被繼承。任何靜態屬於類聲明的類本身。所以,如果你使用靜態的getQueue(),它將是一個類方法,它將屬於類QueueManger類本身。因此,將其作爲實例方法,以便擴展QueueManger的每個類都將擁有自己的getQueue()