对象如何取消标记标记界面?

时间:2012-12-07 12:27:15

标签: java oop interface

class A implements Serializable{

}


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

}

有没有办法在课程B实现/取消标记标记?

示例:如果有两个类A BC。但是只有C才能序列化,而不是B

2 个答案:

答案 0 :(得分:7)

Java不仅缺少对此的支持:这样的功能将彻底打破其OOP基础。类型多态意味着可以在子类型上应用Liskov的替换原则:您的“特征”会使其不适用。

每个子类型都受到它所扩展类型的契约的严格约束:在每个地方,一个引用超类型,子类型的实例必须能够发生。因此,如果超类型是可序列的,我们不能允许任何子类型。

从另一个角度回答,如果您需要来自非序列化类型A中的可序列化类型B的功能,那么将您的设计基于组合而不是继承:让B包括A的适当实例。

答案 1 :(得分:1)

在某些情况下,定义标记界面可能是有意义的,该界面特定地撤消了另一个标记界面的影响。一般来说,这只应在原始标记界面的目的是指示潜在的优化的情况下进行,并且标记的文档从一开始就始终描述其对立面。换句话说,可以使用子类完成所有可以使用子类完成的操作(尽管不一定非常快),并且没有正确编写的代码可以期望优化能够在不能实现的情况下工作。

关于序列化和克隆等事情,有三类:

  1. 那些不知道为什么他们不能被序列化(或克隆),但不公开承诺,因此不对后代类做出任何承诺的人。后代可以是1,2或3类型。
  2. 那些无法序列化,后代也不能序列化的。后代应该都是2型。
  3. 那些公开承诺将它们序列化的内容,暗示只有可以序列化的类才能从它们派生。后代应该都是3型。

如果认识到类可能属于上述三个类别中的任何一个类别,则标记接口的简单模式将变得清晰。没有序列化标记接口的类是类型1.具有“CannotSerialize”标记的类型是类型2。那些有“CanSerialize”的人是第三类。没有类应该实现这两个标记。

不幸的是,我不知道实现该模式的Java或.net框架的任何部分;两者似乎都假设只有两种类型的东西(可以做某事的东西,那些不能做的东西)。不过,对于新类型而言,这是一个很好的模式。