crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Производные классы, нужно изящное решение
ViGOur
  опции профиля:
сообщение 20.12.2016, 14:04
Сообщение #1


Мастер
******

Группа: Модератор
Сообщений: 3318
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 226 раз(а)




Репутация:   41  


Есть класс:

class CClass
{
public:
    virtual void func0();
    virtual void func1();
    virtual void func2();
    virtual void func3();
};
И производные от него классы:
class CClass1 : public CClass
{
public:
    virtual void func0(){}
    virtual void func1(){}
};

class CClass2 : public CClass
{
public:
    virtual void func2(){}
};

class CClass3 : public CClass
{
public:
    virtual void func3(){}
};
В каждом классе частично реализован функционал из класса CClass и если их все соединить, то функционал будет полным.
Нужно так же учесть, то, что какой-то из производных классов можно было бы не использовать (будет функционал CClass по умолчанию)

Нужно изящное решение соединения функционала данных классов, для получения полного функционала!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 20.12.2016, 19:02
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 880
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 136 раз(а)




Репутация:   8  


Миксины? ;)
class DClass : public CClass1, public CClass2, public CClass3 {
}

Если CClass не содержит данных, то должно взлететь нормально.
Естественно есть способ с шаблонами :lol:
http://www.drdobbs.com/cpp/mixin-based-pro...-in-c/184404445
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 21.12.2016, 0:52
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1628
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 226 раз(а)




Репутация:   12  


Цитата(lanz @ 20.12.2016, 21:02) *
Миксины

хм... первый раз вижу такое странное название для обычного множественного наследования :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.12.2016, 8:42
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 771 раз(а)




Репутация:   94  


насколько я помню "примеси" упоминают применительно к наследованию классов с логикой и классов с данными, чтобы получить целевой класс с данными и специфической логикой обработки этих данных

Ну а в обще lanz наверное оптимальный вариант предложил

Сообщение отредактировал Litkevich Yuriy - 21.12.2016, 8:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 21.12.2016, 9:22
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3318
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 226 раз(а)




Репутация:   41  


Множественное наследование не то, так как не известно, будет класс использоваться или нет. (реализации подгружаются из разных либ и создаются фабрикой классов в билдере).
Думал по поводу копирования базового класса, при создании дочернего (конструктор копий), но проблема в том, что в базовом есть данные, которые изменяются и они создаются в стеке.

Пример кода как думал сделать
class CClassExt : public CClass
{
    std::multimap<int, CClass*> m_objects; // Тип, объект
public:
    enum eTypes{
        FNC0=0,
        FNC1,
        FNC2,
        FNC3,
    };
    virtual void func0()
    {
        bool isExist = false;
        for(auto iter = m_objects.begin(); iter != m_objects.end(); ++iter )
        {
            if( iter.first == FNC0 )
            {
                iter.second.func0();
                isExist = true;
            }
        }
        if( !isExist )
            CClass::func0();
    }
};
В коде показана общая идея реализации, не факт что компилится! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 22.12.2016, 8:57
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 880
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 136 раз(а)




Репутация:   8  


Цитата
хм... первый раз вижу такое странное название для обычного множественного наследования :)

Ну множественное наследование это не миксины, миксины это то что нужно как я понял :lol:
Цитата
In object-oriented programming languages, a mixin is a class that contains methods for use by other classes without having to be the parent class of those other classes. How those other classes gain access to the mixin's methods depends on the language. Mixins are sometimes described as being "included" rather than "inherited".

Цитата
Пример кода как думал сделать

А какую задачу нужно решить? Зачем функциональность, реализуемую разными классами засовывать в один?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 22.12.2016, 9:08
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3318
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 226 раз(а)




Репутация:   41  


Цитата(lanz @ 22.12.2016, 8:57) *
А какую задачу нужно решить? Зачем функциональность, реализуемую разными классами засовывать в один?
Просто есть разные модули, решающие похожие задачи (кто-то наиболее полно, кто-то нет) их нужно объединить, чтобы они работали как один.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2016, 23:20
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1628
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 226 раз(а)




Репутация:   12  


\
Цитата(lanz @ 22.12.2016, 10:57) *
Ну множественное наследование это не миксины, миксины это то что нужно как я понял :lol:

в С++ это синонимы, судя по твоему определению. а так как сферического программирования в вакууме нет, то и миксинов нет :)
зато есть наследование. либо вызовы методов через объект какого-то класса.
и пример твой - самое обычное множественное наследование. я просто не понимаю, зачем умножать сущности, когда это совершенно одно и то же.

Цитата(ViGOur @ 21.12.2016, 11:22) *
Множественное наследование не то, так как не известно, будет класс использоваться или нет. (реализации подгружаются из разных либ и создаются фабрикой классов в билдере).

а как будет происходить вызов? откуда вызывающий процесс знает, какие интерфейсы используются, а какие - нет? если вызывающий не знает о других методах, то они ему и не мешают. а методы могут быть просто заглушками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 23.12.2016, 9:19
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 880
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 136 раз(а)




Репутация:   8  


Цитата
в С++ это синонимы, судя по твоему определению.

Нет, как раз наоборот.
Цитата
In object-oriented programming languages, a mixin is a class that contains methods for use by other classes without having to be the parent class of those other classes.

Если пройти по ссылке, которую я привел, там используются шаблоны, а не множественное наследование, ViGOur тоже привел пример как сделать миксин без множественного наследования.
Тот пример который я привел, действительно обычное наследование, но нужен то миксин.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.1.2017, 11:29