我有两个类,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();
}
}
我更喜欢第二种解决方案,但肯定会有更好的东西......
答案 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
。你仍然有一个演员,但它在构造函数中,你不必在每个方法中指定。
(注意:你甚至不需要构造函数中的强制转换,但它提醒你,你的其他引用不是同一类型。)