我有一个抽象类Work
,它有两个抽象方法(init
和work
)和一个使用抽象方法的具体方法(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接口中不能包含一个体。那么在将抽象类转换为接口之后,我必须将通用数据和方法放在哪里?
我担心只要我想分享任何具体内容,就不可能摆脱多重继承问题。这是对的吗?
答案 0 :(得分:2)
您可以执行以下操作:
Work
界面AbstractWork
类,它是实现Work
并包含通用代码的abtract类AbstractWork
这正是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();
}