(Примечание. Предполагается, что этот код является 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
. У вас все еще есть одно приведение, но оно находится в конструкторе, и вам не нужно указывать в каждом методе.
(Примечание: вам даже не нужен приведение в конструкторе, но это хорошее напоминание, что ваша другая ссылка не того типа.)