0

我有一个Work带有两个抽象方法(initwork)的抽象类和一个使用抽象方法的具体方法(run)。

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 接口中不能包含主体。那么在将抽象类转换为接口之后,我必须将泛型数据和方法放在哪里?

我担心只要我想分享任何具体的东西,就不可能摆脱多重继承问题。这是正确的吗?

4

2 回答 2

2

您可以执行以下操作:

  1. 创建Work接口
  2. 创建AbstractWork类,该类是实现Work并包含通用代码的抽象类
  3. 创建扩展的实现类AbstractWork

这正是 JDK 中使用的List(接口)、AbtractList(实现的抽象类List)和LinkedListArrayList扩展的实现类AbstractList)。

于 2013-06-19T13:18:39.203 回答
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();
}
于 2013-06-19T13:34:24.460 回答