如何用Java中的接口替换抽象类?

时间:2013-06-19 13:12:41

标签: java interface abstract-class

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

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

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  1. 创建Work界面
  2. 创建AbstractWork类,它是实现Work并包含通用代码的abtract类
  3. 创建扩展AbstractWork
  4. 的实施类

    这正是JDK中使用的List(接口),AbtractList(实现List的抽象类)和LinkedList以及{{1} (扩展ArrayList)的实现类。

答案 1 :(得分: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();
}