クラスAbstractAction
は interface を実装していますAction
が、 inには interface を継承Action
するメソッド があり
ます クラスが実装しているインターフェイスは、そのインターフェイスのメソッドのすべての実装を提供する必要があることを知っていますしかし、 in
の実装がないことがわかりました。なぜですか?actionPerformed(ActionEvent e)
ActionListener
actionPerformed(ActionEvent e)
AbstractAction
3 に答える
AbstractAction は抽象クラスであるため、インターフェイスにすべてのメソッドを実装する必要はありません。抽象クラスはインスタンス化できないため、サブクラスを作成しないと使用できません。インターフェイスのすべてのメソッドの実装を提供する必要があるのは、具体的なクラス (つまり、非抽象クラス) だけです。AbstractAction をサブクラス化する場合、サブクラスは actionPerformed() を実装するか、抽象化する必要があります。
以上がルールですが、AbstractAction が actionPerformed() を実装するのは意味がありません。なぜなら、それはおそらく有用な実装を提供できないからです。すべてのサブクラスはその定義をオーバーライドする必要があるため、abstract としてマークするのに適しています。
インターフェイスを実装するクラスは、そのインターフェイスのメソッドのすべての実装を提供する必要があることを知っています
抽象クラスの場合は当てはまりません。具象クラスのみが、それが拡張するスーパークラス (抽象クラス) のすべての抽象メソッドと、それが実装するインターフェースのすべてのメソッドの実装を提供することになっています。
しかし、AbstractAction に actionPerformed(ActionEvent e) の実装がないことがわかりました。なぜですか?
彼らは、このクラスを拡張する具象がそのメソッドの実装を提供することを確認するために、そのクラスでそれを抽象化しておきたいと考えていました。
さらに、どのデフォルト アクションを実行しますか (おそらく空または何もない)?
abstract
クラスは不完全であっても構いません。抽象クラスは、インターフェイスまたは親抽象クラスによって指定されたメソッドの一部またはすべてを実装する必要はありません。さらに、抽象クラスは、サブクラスが実装する必要がある新しい抽象メソッドを宣言できます。
クラスを抽象化するために支払われる代償は、直接インスタンス化できないことです。つまり、抽象クラスを使用するには拡張する必要があります。