2013-03-12 2 views
2

Рассмотрим следующую ситуацию пример:Статический конструктор в абстрактном классе?

public abstract class Parent 
{ 
    private ByteBuffer buffer; 

    /* Some default method implementations, interacting with buffer */ 

    public static Parent allocate(int len) 
    { 
     // I want to provide a default implementation of this -- something like: 
     Parent p = new Parent(); 
     p.buffer = ByteBuffer.allocate(len); 
     return p; 
    } 
} 

public class Child extends Parent 
{ 
    /* ... */ 
} 

public class App 
{ 
    public static void main(String[] args) 
    { 
     // I want to ultimately do something like: 
     Child c = Child.allocate(10); 
     // Which would create a new child with its buffer initialized. 
    } 
} 

Очевидно, что я не могу это сделать (new Parent()), так как Родитель является абстрактным, но я не действительно хотят Parent. Я хочу, чтобы этот метод автоматически предоставлялся подклассам.

Я предпочел бы использовать подход «статический конструктор» с .allocate() вместо добавления другого видимого конструктора.

У меня есть какой-либо способ поместить эту реализацию по умолчанию в класс Parent, или каждый из подклассов содержит один и тот же код?

Предполагаю, что другим вариантом будет выделение «абстрактного» из родителя, но абстрактные приставки - мне никогда не нужен объект типа «Родитель».

Заранее спасибо.

+1

Статические методы не наследуются подклассами, поэтому этот подход является фундаментальным недостатком. Возможно, вместо этого вы хотите построить строителя? – Perception

+1

Как вы собираетесь его использовать? Можете ли вы показать пример? Чтобы вызвать 'Child.allocate', вам нужно реализовать статический метод в' Child'. –

+0

Также посмотрите [заводская схема] (http://en.wikipedia.org/wiki/Factory_pattern) –

ответ

4

Если вы изучите коллекцию классов буферов в стандартном JDK, вы заметите, что каждая специализация (ByteBuffer, CharBuffer, DoubleBuffer и т. Д.) Имеет свой собственный статический метод allocate. Есть причина, по которой они не все наследуют от общего базового класса - статические методы не наследуются! Вместо этого они связаны с классом, в котором они определены, и имеют доступ только к переменным уровня класса.

Лучшая модель для того, что вы пытаетесь выполнить, - это шаблон строителя/фабрики. Вы можете изучить класс JAX-RS Response или классы DocumentBuilderFactory для примеров того, как реализовать эти шаблоны.

+0

Определенно, надзор, который я предположил статические методы будут унаследованы. И, несмотря на ссылку на 'Buffer' allocate', я даже не думал, чтобы посмотреть на ее реализацию. Спасибо за предложения. – jedwards

 Смежные вопросы

  • Нет связанных вопросов^_^