Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2017, 00:26   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Разработка интерфейса иерархии классов

Есть такой абстрактный класс:

Код:
class Abstract
{
protected:
    TypeA a;
    TypeB b;
    TypeC c;

public:
    virtual void  getA() = 0;
    virtual void getB() = 0;
    virtual void getC() = 0;
с набором полей и геттеров к этим полям. И несколько классов, производных от Abstract, которые инициализируются значениями из БД.

Интересует проектирование этой иерархии. Определять ли поля в общем абстрактном классе для наследования или дублировать и в каждом наследнике (лишний код)? Методы-геттеры должны быть чисто-виртуальными или просто виртуальные, реализованные в классе Abstract и наследуемые потомками, если в переопределении нет необходимости (например, логика в них онда и та же: возвращается значение поля)?

Могут быть две ситуации:
- Геттеры просто возвращают значение поля.
- Геттеры обращаются к базе, и тогда в класах-потомках логика может различаться

Какой подход лучше? Какой приведет со временем к меньшему объему работы, если понадобится рефакторить API?
Aoizora вне форума Ответить с цитированием
Старый 20.07.2017, 07:26   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

У всех классов одинаковые поля?

Посмотрите как сделано в других ОРМ...
waleri вне форума Ответить с цитированием
Старый 20.07.2017, 10:52   #3
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
У всех классов одинаковые поля?

Посмотрите как сделано в других ОРМ...
А можете посоветовать конкретную ORM для C++?
Aoizora вне форума Ответить с цитированием
Старый 20.07.2017, 11:18   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Если добавите поля в абстрактный класс, то и геттеры нужно реализовывать. Если геттеры у наследников будут разные, то и полям нечего делать в абстрактном классе.
Или прописывать поля и геттеры, но заводить какие-нибудь protected void onGetA() для инициализации значения А и их уже перегружать в наследниках. а в геттере базового класса писать что-то типа:
Код:
if (a == NULL) onGetA();
return a;
только это уже будет не интерфейс в его понимании ООП. Интерфейс не содержит никаких полей и хоть какой-либо реализации метода. Только абстракция, только хардкор.
pu4koff вне форума Ответить с цитированием
Старый 20.07.2017, 16:19   #5
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Если добавите поля в абстрактный класс, то и геттеры нужно реализовывать. Если геттеры у наследников будут разные, то и полям нечего делать в абстрактном классе.
Или прописывать поля и геттеры, но заводить какие-нибудь protected void onGetA() для инициализации значения А и их уже перегружать в наследниках. а в геттере базового класса писать что-то типа:
Код:
if (a == NULL) onGetA();
return a;
только это уже будет не интерфейс в его понимании ООП. Интерфейс не содержит никаких полей и хоть какой-либо реализации метода. Только абстракция, только хардкор.
Идея с перегрузкой onGetA() мне понравилась, потому что эти методы помогут поддерживать состояние класса актуальным после изменений в базе. А как учесть возможность загружать различные версии данных в этих методах? Допустим, даные за разные промежутки времени будут разными.

И еще вопрос: при разработке интерфейса какая разница будет между определением API виртуальными и чисто виртуальными?

Последний раз редактировалось Aoizora; 20.07.2017 в 16:22.
Aoizora вне форума Ответить с цитированием
Старый 20.07.2017, 19:46   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
интерфейса какая разница будет между определением API виртуальными и чисто виртуальными?
При чисто виртуальных нет надобоности делать имплементацию метода интерфейса.
waleri вне форума Ответить с цитированием
Старый 20.07.2017, 20:30   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
только это уже будет не интерфейс в его понимании ООП. Интерфейс не содержит никаких полей и хоть какой-либо реализации метода
То есть например Java и Kotlin не правильно понимают ООП?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите РЕАЛИЗОВАТЬ И ПРОТЕСТОВАТЬ полиморфных МЕТОД В иерархии классов, у меня есть формула по вычислению температуры, вот нужно Nastya1997 Visual C++ 1 17.03.2015 05:09
Создание собственной иерархии классов >>JJ<< Помощь студентам 1 06.07.2011 14:24
указатель на void в иерархии классов. можно ли так делать? ksuxa_m Помощь студентам 0 28.10.2010 21:48
Создание иерархии классов (Delphi) Dawystrik Помощь студентам 1 22.03.2009 16:32