Russian Qt Forum
Апрель 19, 2024, 01:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наследование  (Прочитано 3610 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 17, 2016, 08:09 »

Добрый день

Есть классы
Код
C++ (Qt)
struct CDeformer {
...
};
 
struct CGroup : public CDeformer {
...
};
И вот получается что CDeformer'у нужны очень многие методы CGroup. Переносить их (из CGroup в CDeformer) резона никакого, они к нему отношения не имеют. Конечно это можно легко решить  неск способами, напр
Код
C++ (Qt)
CDeformer::CDeformer( void ) :
 mGroup(static_cast<CGroup *>(this))
{
..
 
Или просто лепить этот static_cast всякий раз когда нужен CGroup. Но не является ли это признаком "корявости архитектуры" и все такое?

Спасибо
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #1 : Октябрь 17, 2016, 11:15 »

Что значит не нужны методы, если он их зовет? Сдаётся мне, у вас один класс надо, а не два.
Еще можно рекурсивным шаблоном сделать, но это те же яйца будут:
Код:
template <class Derived>
class Base {};

class Derived: Base<Derived> {};
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #2 : Октябрь 17, 2016, 11:24 »

Корявость архитектуры - однозначно  Смеющийся.

Вот только как решать? Возможно между Deformer и Group отношение не наследования, а агрегирования или вообще простые ассоциации?

Код
C++ (Qt)
struct Base
{
};
 
struct Deformer : public Base
{
   Group * m_group;
};
 
struct Group : public Base
{
   Deformer * m_group;
};
 

Или общий API просто выделяется общим предком, а не наследованием друг от друга?

Код
C++ (Qt)
struct Base
{
   // common API
};
 
struct Deformer : public Base
{
};
 
struct Group : public Base
{
};
 
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Октябрь 17, 2016, 18:12 »

Можно к CDeformer добавить интерфейсный класс, через который будут вызываться имплементации методов CGroup .
Типа такого:

Код:
class IDeformer
{
public:
  virtual void SomeMethod() = 0;
};

class CDeformer: public IDeformer
{
public:
  virtual void SomeMethod() { // some default impl }
};

class CGroup: public CDeformer
{
public:
  virtual void SomeMethod() { //  impl for CGroup}
};
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 20, 2016, 10:38 »

Все-таки заменил на членство (агрегирование). СDeformer может быть только один (у одного CGroup) и его не может не быть - ну вроде бы наследование. Но тут неприятный эффект, пример
Код
C++ (Qt)
Container * CDeformer::GetVertexList( void );
А у CGroup немало всяких VertexList помимо деформера, пришлось раздувать имена (GetDeformerVertexList). Также получается что подавляющее большинство методов СDeformer'а - чистые виртуалы, без CGroup он практически нулевой. А вот данные-члены у него свои, и приличные.

В общем "настоять" на наследовании конечно можно, но как-то смысла не видно. Мда...   
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 22.