|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|
Куда лучше поместить метод?06.04.2019, 13:56. Показов 3127. Ответов 67
Метки нет (Все метки)
У базового класса есть наследники: классы A, B, C, D. У классов A, B, C есть один и тот же метод, который использует поля базового. Куда его лучше поместить: в базовый класс, тогда этот метод будет и у D, которому он не нужен; или сделать интерфейс для этих трех классов? И еще возможность сделать метод статическим и поместить его куда-нибудь, к примеру в тот же базовый класс и передавать ему в параметры поля.
0
|
|
| 06.04.2019, 13:56 | |
|
Ответы с готовыми решениями:
67
Сохранение файла с настройками: куда лучше сохранять Куда лучше всего сохранять данные (числовые и текстовые) |
|
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141
|
|
| 06.04.2019, 14:01 | |
|
Я бы сделал интерфейс, если опираться на правила SOLID по крайней мере
1
|
|
|
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
|
|
| 06.04.2019, 14:02 | |
|
Passerby, ИМХО, логичнее описать метод в интерфейсе и реализовать его в тех классах, в которых он нужен.
1
|
|
|
Администратор
|
|
| 06.04.2019, 14:31 | |
|
Passerby, можно сделать protected метод в базовом. То что он не будет использоваться в классе D не является проблемой.
1
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 06.04.2019, 14:43 | |||||||
2
|
|||||||
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|
| 06.04.2019, 16:23 [ТС] | |
|
Думаю сделать, как посоветовал OwenGlendower: лучше одна лишняя ссылка на метод в D, чем лишний интерфейс или лишний промежуточный класс, в которых, даже если они пустые, масса ссылок. Или я в этом рассуждении неправ?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 06.04.2019, 20:45 | |
|
0
|
|
|
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
|
|
| 06.04.2019, 20:51 | |
|
Вообще интерфейси и нужны для проектирование бизнес логики. Если правильно смотреть с точки зрения, весь алгоритм держится на интерфейсах. А там крути верти как хочешь, и показывай то что тебе нужно.
1
|
|
|
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
|
|
| 06.04.2019, 23:52 | |
|
Passerby, Недостаток наследования – хрупкий базовый класс. Базовый класс может обладать ненужным функционалом, полученным от других его базовых классов, чего можно избежать, применяя интерфейсы.
1
|
|
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
||
| 07.04.2019, 14:55 [ТС] | ||
|
Т.е. в случае класса и интерфейса, в D из первоначального вопроса, получаем не одну ссылку на метод, а ссылку на класс или интерфейс со своими лишними в данном случае ссылками.
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 07.04.2019, 15:15 | ||
|
Глубина наследования вообще никак не влияет на количество ссылок в конкретном экземпляре.
0
|
||
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|
| 07.04.2019, 15:32 [ТС] | |
|
kolorotur, поясните, как происходит обращение к функции базового класса при наличии промежуточного (как вы посоветовали). Я считал, что происходит лишнее вычисление адреса.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 07.04.2019, 16:24 | |||
|
Либо производится сразу обращение к нужной реализации, либо в таблице методов указан адрес ближайшей переопределенной версии, либо переопределенная версия ищется вверх по цепочке наследования. ![]() Да, может происходить, если рантайм реализует виртуальный вызов последним из перечисленных выше способов. Вы это называете ссылкой и вас это беспокоит?
1
|
|||
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
||
| 07.04.2019, 17:40 [ТС] | ||
|
1) С точки зрения программиста, т.е. с точки зрения читаемости кода введение промежуточного класса облегчает читаемость за счет закрытия в классе в котором не нужен метод ссылки на него, но при этом ухудшает, т.к. вводится новый класс или интерфейс. 2) С точки зрения повышения скорости кода, и уменьшения памяти под программу, то тоже выигрыша нет, а есть незначительный проигрыш, т.к. есть лишний класс и лишние вычисления (хотя, и очень незначительные). И почему нет такой фички, как закрытие видимости метода или свойства для конкретных наследующих классов: в этом случае количество интерфейсов и классов в коде значительно бы уменьшилось.
0
|
||
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|||
| 07.04.2019, 17:44 | |||
|
0
|
|||
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|||
| 07.04.2019, 18:00 [ТС] | |||
|
0
|
|||
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|||
| 07.04.2019, 18:25 | |||
|
теперь мой код не компилируется или падает в рантайме. а после исправления КАЖДЫЙ вызов ЛЮБОГО метода находится в try catch, вдруг его в след реализации наследника решат скрыть
0
|
|||
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
||||
| 07.04.2019, 18:36 [ТС] | ||||
|
0
|
||||
|
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
|
|||||
| 07.04.2019, 18:47 | |||||
|
В варианте с промежуточным классом петя унаследовался бы от "фигуры", а не "цветной фигуры" и его треугольник никак бы не оказался в моем листе "цветных фигур" И вообще лучше объясните нормально что хотите создать, без абстрактных ABCD. Тогда можно будет на конкретном примере прийти к логичному решению
0
|
|||||
|
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
|
|||
| 07.04.2019, 19:12 [ТС] | |||
|
0
|
|||
| 07.04.2019, 19:12 | |
|
Помогаю со студенческими работами здесь
20
Куда поместить функции? SDL: куда поместить библиотеку Куда поместить файлы проекта? Куда поместить код в конфигураторе? Куда поместить главные фотографии сайта? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|