2013-06-19 3 views
0

У меня есть абстрактный класс Work с двумя абстрактными методами (init и work) и один конкретный метод (run), работающий с абстрактными методами.Как заменить абстрактный класс интерфейсом на Java?

class work 
{ 
    abstract static class Work<T> implements Runnable 
    { 
     T data; 

     abstract protected void init(); 
     abstract protected void work(); 

     public void run() 
     { 
      init(); 
      work(); 
      System.out.println (data); 
     } 
    } 

    public static void main (String[] args) 
    { 
     Runnable hello = new Work<String>() { 
      protected void init() { data = "Hello $1!"; } 
      protected void work() { data = data.replace ("$1", "World"); } 
     }; 

     (new Thread(hello)).start(); 
    } 
} 

Для того, чтобы избавиться от проблемы множественного наследования Я хотел бы преобразовать абстрактный класс в интерфейс. Но в интерфейсах Java не может содержаться тело. Итак, где я должен поместить общие данные и метод после преобразования абстрактного класса в интерфейс?

Я боюсь, что избавиться от проблемы множественного наследования невозможно, если я хочу поделиться чем-то конкретным. Это правильно?

+0

Где и как вы сталкиваетесь с проблемой множественного наследования здесь? –

+0

Я боюсь, что это невозможно, одной альтернативой множественному наследованию является инкапсуляция, где «дочерний» класс перестает расширять родительский класс и начинает иметь экземпляр «родительского» класса в качестве поля, а затем использует его методы. Является ли это подходящим, зависит в значительной степени от вашего случая использования, хотя –

+0

Это может помочь, если вы показываете другой родительский класс, который должен расширять дочерний класс, и как ребенок будет использовать оба родителя. –

ответ

1

Вы можете сделать что-то вроде:

  1. Создания интерфейса Work
  2. Создает AbstractWork класса, который является Abtract класса, реализующим Work и содержащим общий код
  3. Создайте классы реализации простирающихся AbstractWork

Это именно то, что используется в JDK с List (интерфейс), AbtractList (класс абстрактного класса List) и LinkedList и ArrayList (классы реализации, распространяющиеся на AbstractList).

+0

В чем причина того, что есть как List, так и AbstractList? Можно отметить все, что находится в AbstractList, но не в списке как «protected». В чем разница между защищенным AbstractList и списком интерфейсов? – ceving

+0

Аннотация содержит общий код, используемый многими реализациями List. Тем не менее, существует также реализация List, которая не расширяет AbstractList и, следовательно, не использует вообще общий код, содержащийся в абстрактном классе. Интерфейс определяет контракт, в то время как абстрактный класс содержит общий код. –

+0

Сначала это означает, что глупо идея заменить абстрактный класс интерфейсом, потому что это невозможно. И, во-вторых, это глупая идея подумать, что можно было бы избавиться от проблемы наследования, потому что вокруг нет никакого пути. Это напоминает мне о том, что Java меня пугает. – ceving

1

Возможно, вам придется отделить интерфейс от функциональности; что-то вроде этого:

public interface Work<T> { 
    void init(); 
    T work(); 
} 

public class Worker<T> implements Runnable { 

    private final Work<T> work; 

    Worker(Work<T> work) { 
     this.work = work; 
    } 

    public void run() { 
     work.init(); 
     T data = work.work(); 
     System.out.println(data); 
    } 
} 

public static void main (String[] args) 
{ 
    Runnable hello = new Worker<String>(new Work<String>() { 
     private String data; 
     public void init() { data = "Hello $1!"; } 
     public String work() { return data.replace ("$1", "World"); } 
    }); 

    (new Thread(hello)).start(); 
} 
+0

Это не сильно меняется. 'hello' по-прежнему является« Worker », и я не могу наследовать его от чего-то другого. – ceving

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