如何为基类和派生类编写包装器(适配器)



我有两个类,Base和Derived,我想围绕它们编写包装器。派生包含基本中不存在的附加功能。这些类超出了我的控制范围,我无法修改它们。

问题是:如何在不需要a)强制转换或b)严重的代码重复的情况下包装这两个类?

以下是铸造的解决方案:

class BaseWrapper {
    Base b;
    someFunction() {
        b.someFunction();
    }
}
class DerivedWrapper : BaseWrapper {
    someOtherFunction() {
        ((Derived) b).someOtherFunction();
    }
}

这里有一个复制:

class BaseWrapper {
    Base b;
    someFunction() {
        b.someFunction();
    }
}
class DerivedWrapper {
    Derived d;
    someFunction() {
        d.someFunction();
    }
    someOtherFunction() {
        d.someOtherFunction();
    }
}

我更喜欢第一种解决方案而不是第二种,但肯定有更好的解决方案。。。

(注意:假设此代码是C#或类似C#的伪代码)

几乎我唯一能想到的就是将BaseWrapper子类化,将对对象的额外引用作为其实际类型(Derived),并将b设置为(Base) d。假设你在构造函数中传递包装好的对象,我会这样设置它:

class BaseWrapper {
    Base b;
    someFunction() {
        b.someFunction();
    }
}
class DerivedWrapper : BaseWrapper {
    Derived d;
    DerivedWrapper(Derived d) {
        this.d = d;
        this.b = (Base) d;
    }
    someOtherFunction() {
        d.someOtherFunction();
    }
}

someFunction继续在超类中工作,因为您仍然有一个Base b。您仍然有一个强制转换,但它在构造函数中,不必在每个方法中都指定。

(注意:您甚至不需要构造函数中的强制转换,但它很好地提醒您,您的其他引用不是同一类型。)

最新更新