繁体   English   中英

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

[英]How to substitute an abstract class with an interface in Java?

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

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

您可以执行以下操作:

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

这正是JDK中使用List (接口), AbtractList (实现List的抽象类)以及LinkedListArrayList (扩展AbstractList的实现类)所使用的功能。

您可能必须将界面与功能分开; 像这样的东西:

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM