Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> using-declaration 
:(
    Опции темы
iiizxc
  Дата 2.3.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



Имеется следующий дизайн:
Код

class ISome
{
public:

    void someMethod1() {};
    void someMethod2() {};
};

class IAnother
{
public:

    void anotherMethod1() {};
};

class Object:
    public ISome,
    public IAnother
{
    using ISome::someMethod1;
    using ISome::someMethod2;
    using IAnother::anotherMethod1;
};

Объект Object является композицией имплементаций интерфейсов ISome и IAnother, однако сам как интерфейс не позволяет воспользоваться методами ISome и IAnother.
Код

Object object;

object.someMethod1(); // ERROR: cannot access private member

Тем не менее, Object позволяет перекастовать себя к интерфейсу ISome или IAnother (public наследование), и таким образом получить доступ к соответствующим методам.
Код

    Object object;

    ISome & some = static_cast< ISome & >( object );
    some.someMethod1();
    some.someMethod2();

    IAnother & another = static_cast< IAnother & >( object );
    another.anotherMethod1();


Проблема в том, что количество методов ISome или IAnother может быть большим и список этих методов может меняться.
Необходимо же все метоты и поля этих интерфейсов сделать private в Object. Так, объявление вроде
Код

class Object:
    public ISome,
    public IAnother
{
    using class ISome;
    using class IAnother;
};

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

Вопрос: можно ли все-таки как-то добиться желаемого?
Приватное наследование и перегрузка перекастовки - это не то.

PM MAIL   Вверх
Alek86
Дата 2.3.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



не делать Object наследником этих интерфейсов, а агрегировать их имплементации
при необходимости добавить или функции типа ISome* ToSome() или вообще операторы преобразования а-ля operator ISome&() (хотя особого смысла в операторе не вижу)

лучше всего сделать проксю
Код
class Helper:
    public ISome,
    public IAnother {};

class Object {
 ISome& ToSome() { return m_impl; }
 const ISome& ToSome() const { return m_impl; }
private:
 Helper m_impl;
};


Добавлено через 1 минуту и 50 секунд
но решение настолько корявое, что возникает вопрос - а зачем эти извращения нужны? в чем задача заключается?


--------------------
user posted image    user posted image
PM MAIL   Вверх
iiizxc
Дата 2.3.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



Alek86, нет, агрегация с делегированием перекастовки - это тоже не то. Не спрашивайте, зачем это понадобилось smile
PM MAIL   Вверх
Alek86
Дата 2.3.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



чем именно не нравится?
(кстати, сложно отвечать на твой вопрос, не зная всей "обстановки")

имхо, в общем случае мой вариант получше кучи юзингов, которые не контролируются компилятором (то есть добавишь паблик в ISome - он молча появится в пабликах Object'а)


--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0420 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.