class A implements Serializable{
}
class B extends A{
//this also inherits the marker
}
有没有办法在课程B
中实现/取消标记标记?
示例:如果有两个类A
B
和C
。但是只有C
才能序列化,而不是B
。
答案 0 :(得分:7)
Java不仅缺少对此的支持:这样的功能将彻底打破其OOP基础。类型多态意味着可以在子类型上应用Liskov的替换原则:您的“特征”会使其不适用。
每个子类型都受到它所扩展类型的契约的严格约束:在每个地方,一个引用超类型,子类型的实例必须能够发生。因此,如果超类型是可序列的,我们不能允许任何子类型。
从另一个角度回答,如果您需要来自非序列化类型A
中的可序列化类型B
的功能,那么将您的设计基于组合而不是继承:让B
包括A
的适当实例。
答案 1 :(得分:1)
在某些情况下,定义标记界面可能是有意义的,该界面特定地撤消了另一个标记界面的影响。一般来说,这只应在原始标记界面的目的是指示潜在的优化的情况下进行,并且标记的文档从一开始就始终描述其对立面。换句话说,可以使用子类完成所有可以使用子类完成的操作(尽管不一定非常快),并且没有正确编写的代码可以期望优化能够在不能实现的情况下工作。
关于序列化和克隆等事情,有三类:
如果认识到类可能属于上述三个类别中的任何一个类别,则标记接口的简单模式将变得清晰。没有序列化标记接口的类是类型1.具有“CannotSerialize”标记的类型是类型2。那些有“CanSerialize”的人是第三类。没有类应该实现这两个标记。
不幸的是,我不知道实现该模式的Java或.net框架的任何部分;两者似乎都假设只有两种类型的东西(可以做某事的东西,那些不能做的东西)。不过,对于新类型而言,这是一个很好的模式。