Расширить класс без изменения его имени - PullRequest
0 голосов
/ 18 марта 2012

У меня есть ситуация: в одном решении у меня есть два проекта. Мне нужно расширить класс: Foo , используемый в Project: A , чтобы я мог добавить новую функциональность, требуемую в Project: B , не меняя его имени. Проблема: Класс: Foo уже содержит (то есть имеет) Класс: Bar и содержится в классе: Goo в обоих проектах: A & Проект: B . В проекте: B Я наследую класс: Goo в класс: Goo_Ex ; но мне нужно также расширить оба: Class: Foo и Class: Bar с сопутствующими функциями.

Чтобы было понятнее - я мог бы сделать это, используя следующий raw метод:

/* Project:A-Class:Foo */

class Foo
{
    .
    .
    .
# ifdef PROJECT_B
    fnExtended();
# endif
};

но это засоряет мой код в Project: A.

Возможное решение, которое я могу придумать, - это использовать Inheritance и иметь класс: Foo_Global Inherited- [Only] как класс: Foo в проекте: A и Inherited- [Extend] как, опять же, класс: Foo в проекте: B ; То же самое для класса: Бар . Но является ли это более простым решением? ..

Ответы [ 3 ]

1 голос
/ 18 марта 2012

Я думаю, что предложенное вами решение (чтобы скрыть текущее Foo от имени другого класса и наследовать его в новом классе Foo в обоих проектах) - это то, как вы должны это сделать.

0 голосов
/ 18 марта 2012

Способ продлить свой класс - не продлевать его! Просто используйте функцию, принимающую подходящие аргументы.

0 голосов
/ 18 марта 2012

Это действительно абстрактная проблема, и трудно дать вам хорошее конкретное решение без дополнительных подробностей.

Основным способом решения этой проблемы является наследование.Но это требует предварительного планирования.Это означает, что когда вы ссылаетесь на Foo в проекте A, вы должны использовать указатели или ссылки.Если вы создаете Foo (и вам нужен код из проекта A, создайте Foo_Extended, когда он является частью проекта B), вам потребуется настраиваемая фабрика Foo, которая будет создавать объекты соответствующего типа в зависимости от контекста.

Другойспособ обработки это шаблоны.У вас никогда нет кода в проекте A, ссылающегося непосредственно на глобальный класс Foo.Вместо этого он всегда ссылается на параметр шаблона.В проекте A этот параметр шаблона в конечном итоге будет преобразован в Foo, а в проекте B он будет преобразован в некоторый другой класс, обладающий необходимой функциональностью.

Это два основных способа решения этой проблемы в C ++.И то, что вы используете, во многом зависит от деталей контекста, в котором вы их используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...