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

时间:2012-02-26 01:48:12

标签: inheritance design-patterns wrapper adapter

我有两个类,Base和Derived,我想在其中编写包装器。 Derived包含Base中不存在的其他功能。这些课程不受我的控制,我无法修改它们。

问题是:如何在没有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();
    }
}

我更喜欢第二种解决方案,但肯定会有更好的东西......

1 个答案:

答案 0 :(得分:0)

(注意:假设此代码为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。你仍然有一个演员,但它在构造函数中,你不必在每个方法中指定。

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