Как я могу написать оболочки (адаптеры) для базового и производного класса? - PullRequest
1 голос
/ 26 февраля 2012

У меня есть два класса, Base и Derived, вокруг которых я хочу написать обертки. Производная содержит дополнительные функции, отсутствующие в базе. Эти классы находятся вне моего контроля, и я не могу их изменить.

Вопрос заключается в следующем: как я могу обернуть оба класса без а) приведения или б) значительного дублирования кода?

Вот решение с кастингом:

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 голосов
/ 26 февраля 2012

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

(Примечание: вам даже не нужен приведение в конструкторе, но это хорошее напоминание, что ваша другая ссылка не того типа.)

...