抽象クラス
抽象クラスは、サブクラスの構築パラメーターを取得します
このアイデアは、ApplicationEventから来ています。
Springイベントをカスタマイズするときは、次のように定義します。
package com.example.tmp;
import org.springframework.context.ApplicationEvent;
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
このパラメーター化されたコンストラクターを追加しない場合、エラーが報告されます。
ソースコード
public abstract class ApplicationEvent extends EventObject { private static final long serialVersionUID = 7099057708183571937L; private final long timestamp; public ApplicationEvent(Object source) { super(source); this.timestamp = System.currentTimeMillis(); } public final long getTimestamp() { return this.timestamp; } }
public class EventObject implements java.io.Serializable { private static final long serialVersionUID = 5516075349620653480L; protected transient Object source; public EventObject(Object source) { if (source == null) throw new IllegalArgumentException("null source"); this.source = source; } public Object getSource() { return source; } public String toString() { return getClass().getName() + "[source=" + source + "]"; } }
ApplicationEventクラスの関係
総括する
Springは最後にEventObjectを使用して、抽象サブクラス(この場合はApplicationEvent)を持つイベントデータ(ソースフィールド)を格納し、コンストラクターで抽象サブクラスをスーパーペアレントにします。パラメーターはイベントデータです。
一方では、ApplicationEventを継承する通常のクラスはパラメーター化されたコンストラクターを提供する必要があり、super()を使用して抽象クラスApplicationEventのコンストラクターを呼び出す必要があります(抽象クラス自体は直接インスタンス化できないため、サブクラス)
一方、ApplicationEvent抽象クラスにはコンストラクターにスーパー親クラスがあり、パラメーターはイベントデータであるため、EventObjectをイベントデータに格納できます。
EventObjectは、多くのサブクラス(すべての抽象クラス)を持つ基本クラスであり、ApplicationEventはサブクラスの1つです。EventObjectはイベントデータを保存し、サブクラスにはいくつかの拡張機能があります。サブクラスはApplicationEventに似ており、パラメーターコンストラクターがあり、その中でEventObjectコンストラクターをスーパー呼び出しします。
インターフェース
複数の実装クラスが同じインターフェースを実装します
interface ITop
interface IA extends ITop
class AImpl implements IA
interface IB extends ITop
class BImpl extends AImpl implements IB