class A implements Serializable{
}
class B extends A{
//this also inherits the marker
}
クラス内でマーカーを実装/マーク解除する方法はありB
ますか?
例:A
namedB
および を拡張する 2 つのクラスがある場合C
。しかし、それらのうち、C
シリアライズ可能にしたいだけで、B
.
Java がこれをサポートしていないというだけではありません。そのような機能は、OOP の基盤を完全に壊してしまいます。型ポリモーフィズムとは、リスコフの置換原則をサブタイプに適用できることを意味します。あなたの「機能」はそれを適用できなくします。
すべてのサブタイプは、それが拡張するタイプのコントラクトによって厳密にバインドされます。スーパータイプを参照する各場所で、サブタイプのインスタンスが発生できる必要があります。したがって、スーパータイプがシリアライズ可能である場合、サブタイプをシリアライズできないようにすることはできません。
別の観点から答えると、シリアライズ可能A
でないタイプのシリアライズ可能なタイプの機能が必要な場合はB
、継承ではなく構成に基づいて設計を行います。B
適切なインスタンスを含めるようにしますA
。
場合によっては、別のマーカー インターフェイスの効果を具体的に元に戻すマーカー インターフェイスを定義することが理にかなっている場合があります。一般に、これは、元のマーカー インターフェイスの目的が潜在的な最適化を示すことであり、マーカーのドキュメントが最初から常にそのアンチテーゼを説明している場合にのみ行う必要があります。言い換えれば、基本クラスで実行できることはすべて子クラスで実行でき (ただし必ずしも高速であるとは限りません)、適切に作成されたコードでは、最適化が実行できない場所で最適化が実行されることは期待されません。
シリアライゼーションやクローン作成などに関して、クラスには次の 3 つのカテゴリがあります。
クラスが上記の 3 つのカテゴリのいずれかに分類される可能性があることを認識すると、マーカー インターフェイスの単純なパターンが明らかになります。serialization-marker インターフェイスを持たないクラスはタイプ 1 です。「CannotSerialize」マーカーを持つクラスはタイプ 2 です。「CanSerialize」を持つものはタイプ 3 です。両方のマーカーを実装するクラスはありません。
残念ながら、そのパターンを実装する Java または .net フレームワークのどの部分も認識していません。どちらも、2 種類のクラス (何かを実行できるものと実行できないもの) しかないと想定しているようです。それでも、新しいタイプが前進するための良いパターンです。