0

Work2 つの抽象メソッド (initおよびwork) と、抽象メソッドで動作する 1 つの具象メソッド ( )を持つ抽象クラスがあり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

これはまさに、(Listインターフェース)、AbtractList(を実装する抽象クラスList)、LinkedListおよびArrayList(を拡張する実装クラス) とともに JDK で使用されるものです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 に答える