0
class A implements Serializable{

}


class B extends A{
    //this also inherits the marker 

}

クラス内でマーカーを実装/マーク解除する方法はありBますか?

例:A namedBおよび を拡張する 2 つのクラスがある場合C。しかし、それらのうち、Cシリアライズ可能にしたいだけで、B.

4

2 に答える 2

7

Java がこれをサポートしていないというだけではありません。そのような機能は、OOP の基盤を完全に壊してしまいます。型ポリモーフィズムとは、リスコフの置換原則をサブタイプに適用できることを意味します。あなたの「機能」はそれを適用できなくします。

すべてのサブタイプは、それが拡張するタイプのコントラクトによって厳密にバインドされます。スーパータイプを参照する各場所で、サブタイプのインスタンスが発生できる必要があります。したがって、スーパータイプがシリアライズ可能である場合、サブタイプをシリアライズできないようにすることはできません。

別の観点から答えると、シリアライズ可能Aでないタイプのシリアライズ可能なタイプの機能が必要な場合はB、継承ではなく構成に基づいて設計を行います。B適切なインスタンスを含めるようにしますA

于 2012-12-07T12:29:21.220 に答える
1

場合によっては、別のマーカー インターフェイスの効果を具体的に元に戻すマーカー インターフェイスを定義することが理にかなっている場合があります。一般に、これは、元のマーカー インターフェイスの目的が潜在的な最適化を示すことであり、マーカーのドキュメントが最初から常にそのアンチテーゼを説明している場合にのみ行う必要があります。言い換えれば、基本クラスで実行できることはすべて子クラスで実行でき (ただし必ずしも高速であるとは限りません)、適切に作成されたコードでは、最適化が実行できない場所で最適化が実行されることは期待されません。

シリアライゼーションやクローン作成などに関して、クラスには次の 3 つのカテゴリがあります。

  1. シリアル化 (またはクローン) できない理由を知らないが、それについて公に約束していないため、子孫クラスについて何も約束していないもの。子孫は、タイプ 1、2、または 3 のいずれかです。
  2. シリアル化できないもの、およびその子孫もシリアル化できないもの。子孫はすべてタイプ 2 である必要があります。
  3. シリアル化できるクラスのみが派生する必要があることを暗示して、シリアル化されることを公に約束するもの。子孫はすべてタイプ 3 である必要があります。

クラスが上記の 3 つのカテゴリのいずれかに分類される可能性があることを認識すると、マーカー インターフェイスの単純なパターンが明らかになります。serialization-marker インターフェイスを持たないクラスはタイプ 1 です。「CannotSerialize」マーカーを持つクラスはタイプ 2 です。「CanSerialize」を持つものはタイプ 3 です。両方のマーカーを実装するクラスはありません。

残念ながら、そのパターンを実装する Java または .net フレームワークのどの部分も認識していません。どちらも、2 種類のクラス (何かを実行できるものと実行できないもの) しかないと想定しているようです。それでも、新しいタイプが前進するための良いパターンです。

于 2012-12-07T18:10:44.863 に答える