我有两个类,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
。您仍然有一个强制转换,但它在构造函数中,不必在每个方法中都指定。
(注意:您甚至不需要构造函数中的强制转换,但它很好地提醒您,您的其他引用不是同一类型。)