2

我有一个具有非唯一名称的自动生成的类。由于无法更改此类或生成该类的文件,因此我将其放入了自己的包中。这导致我需要在需要声明或强制转换此对象时输入整个包。

我对此的解决方案是创建一个子类,如下所示

public UniqueName extends BaseClass
{
   // This class is empty and intended to be used as an alias. 
}

不幸的是,我遇到了另一个问题,序列化和反序列化只能在基类上完成。

我想知道的是是否有办法将该基类转换为扩展它的别名类?我尝试将基类转换为别名类,但我从 Eclipse 收到了几个错误。

4

1 回答 1

0

我知道,由于某种原因 BaseClass 是不可修改的,您希望最终得到一个更“有用”的 BaseClass 版本。

与其扩展 BaseClass,不如在 UniqueName 上委托给它:

public BaseClass{
    public void usefulMethod() { ... }

    public void lessUsefulMethod() { ... }
}

public UniqueName 
{
    private BaseClass baseClass;

    public UniqueName(BaseClass baseClass){ this.baseClass = baseClass; } 

    public void usefulMethod() { return baseClass.usefulMethod(); }

    public void moreUsefulMethod(){
       ...
       baseClass.lessUsefulMethod();
       ... 
    }
}

不是从 BaseClass 类型转换为 UniqueName,而是使用将 BaseClass 作为参数的构造函数创建 UniqueName 的实例。

如果您需要保持 UniqueName 与 BaseClass 的“is-a”关系,您可以这样做。但不要忘记覆盖每个方法并将其委托给 baseClass 实例。

PS:如果您在序列化/反序列化中遇到对象替换的问题,ObjectInputStream 和 ObjectOutputStream 类有 replaceObject 和 resolveObject 方法,这允许我们替换序列化中的对象类型。

于 2014-01-05T23:14:03.650 回答