Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242

Куда лучше поместить метод?

06.04.2019, 13:56. Показов 3127. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У базового класса есть наследники: классы A, B, C, D. У классов A, B, C есть один и тот же метод, который использует поля базового. Куда его лучше поместить: в базовый класс, тогда этот метод будет и у D, которому он не нужен; или сделать интерфейс для этих трех классов? И еще возможность сделать метод статическим и поместить его куда-нибудь, к примеру в тот же базовый класс и передавать ему в параметры поля.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2019, 13:56
Ответы с готовыми решениями:

Большое число куда поместить
Здравствуйте , вкратце мне нужно возводить числа 53 ( например) в степень 43 с точностью знаков в 30. примерно как на калькуляторе...

Сохранение файла с настройками: куда лучше сохранять
Мне нужно сохранить файл с настройками программы в такое место, к которому у данного пользователя всегда бы был доступ на чтение/запись...

Куда лучше всего сохранять данные (числовые и текстовые)
Здравствуйте! Подскажите пожалуйста, куда лучше всего сохранять данные (числовые и текстовые). К примеру в базу данных Access или SQL...

67
 Аватар для nekonihilist
38 / 27 / 13
Регистрация: 06.11.2018
Сообщений: 141
06.04.2019, 14:01
Я бы сделал интерфейс, если опираться на правила SOLID по крайней мере
1
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
06.04.2019, 14:02
Passerby, ИМХО, логичнее описать метод в интерфейсе и реализовать его в тех классах, в которых он нужен.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18285 / 14208 / 5368
Регистрация: 17.03.2014
Сообщений: 28,888
Записей в блоге: 1
06.04.2019, 14:31
Passerby, можно сделать protected метод в базовом. То что он не будет использоваться в классе D не является проблемой.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.04.2019, 14:43
Цитата Сообщение от Passerby Посмотреть сообщение
базового класса есть наследники: классы A, B, C, D. У классов A, B, C есть один и тот же метод, который использует поля базового. Куда его лучше поместить: в базовый класс, тогда этот метод будет и у D, которому он не нужен;
Ну тогда сделайте промежуточный класс "Базовый с половиной", в котором и будет определен этот метод, который нужен всем, кроме D:
C#
1
2
3
4
5
6
7
8
9
10
11
12
class Base { }
class Derived : Base
{
   protected void Foo()
   {
   }
}
 
class A : Derived { }
class B : Derived { }
class C : Derived { }
class D : Base { }
2
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
06.04.2019, 16:23  [ТС]
Думаю сделать, как посоветовал OwenGlendower: лучше одна лишняя ссылка на метод в D, чем лишний интерфейс или лишний промежуточный класс, в которых, даже если они пустые, масса ссылок. Или я в этом рассуждении неправ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.04.2019, 20:45
Цитата Сообщение от Passerby Посмотреть сообщение
промежуточный класс, в которых, даже если они пустые, масса ссылок.
Не улавливаю связи между глубиной наследования и количеством ссылок.
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
06.04.2019, 20:51
Вообще интерфейси и нужны для проектирование бизнес логики. Если правильно смотреть с точки зрения, весь алгоритм держится на интерфейсах. А там крути верти как хочешь, и показывай то что тебе нужно.
1
 Аватар для ShmelVG
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  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Не улавливаю связи между глубиной наследования и количеством ссылок.
Я имел в виду, что даже пустой объект класса имеет ссылки (которые не факт, что понадобятся) Equals, GetHeshCode, GetType, ToString. И класс также, как и интерфейс ссылки на статические ReferenceEquals, Equals.
Т.е. в случае класса и интерфейса, в D из первоначального вопроса, получаем не одну ссылку на метод, а ссылку на класс или интерфейс со своими лишними в данном случае ссылками.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.04.2019, 15:15
Цитата Сообщение от Passerby Посмотреть сообщение
Я имел в виду, что даже пустой объект класса имеет ссылки (которые не факт, что понадобятся) Equals, GetHeshCode, GetType, ToString.
У вас какие-то очень странные представления о расположении объектов в памяти.
Глубина наследования вообще никак не влияет на количество ссылок в конкретном экземпляре.
0
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
07.04.2019, 15:32  [ТС]
kolorotur, поясните, как происходит обращение к функции базового класса при наличии промежуточного (как вы посоветовали). Я считал, что происходит лишнее вычисление адреса.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.04.2019, 16:24
Цитата Сообщение от Passerby Посмотреть сообщение
как происходит обращение к функции базового класса при наличии промежуточного
Зависит от того, как этот метод вызывается и от того, как реализована таблица виртуальных методов в среде выполнения.
Либо производится сразу обращение к нужной реализации, либо в таблице методов указан адрес ближайшей переопределенной версии, либо переопределенная версия ищется вверх по цепочке наследования.

Цитата Сообщение от Passerby Посмотреть сообщение
Я считал, что происходит лишнее вычисление адреса.
В смысле "лишнее"?
Да, может происходить, если рантайм реализует виртуальный вызов последним из перечисленных выше способов.
Вы это называете ссылкой и вас это беспокоит?
1
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
07.04.2019, 17:40  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Вы это называете ссылкой и вас это беспокоит?
Не знаю, правильно ли я вас понял. Я имел в виду, что выигрыша нет по следующим причинам:
1) С точки зрения программиста, т.е. с точки зрения читаемости кода введение промежуточного класса облегчает читаемость за счет закрытия в классе в котором не нужен метод ссылки на него, но при этом ухудшает, т.к. вводится новый класс или интерфейс.
2) С точки зрения повышения скорости кода, и уменьшения памяти под программу, то тоже выигрыша нет, а есть незначительный проигрыш, т.к. есть лишний класс и лишние вычисления (хотя, и очень незначительные).
И почему нет такой фички, как закрытие видимости метода или свойства для конкретных наследующих классов: в этом случае количество интерфейсов и классов в коде значительно бы уменьшилось.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
07.04.2019, 17:44
Цитата Сообщение от Passerby Посмотреть сообщение
И почему нет такой фички
она бы минимум столько же доп ресурсов и ела, да и читаемость бы понижала
Цитата Сообщение от Passerby Посмотреть сообщение
для конкретных наследующих классов
базовый класс не знает ничего о наследниках. это критический удар по читаемости и поддерживаемости
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
Цитата Сообщение от Passerby Посмотреть сообщение
За счет чего понижала бы читаемость?
методы будут магически исчезать у наследников, придется каждый класс инспектировать
Цитата Сообщение от Passerby Посмотреть сообщение
В чем удар по читаемости и поддерживаемости?
есть у меня лист цветных фигур. я в цикле пробегаюсь по ним и вывожу только цвет фигуры с соответствующим индексом. петя решил что его треугольник - цветная фигура, но скрыл метод получения цвета.
теперь мой код не компилируется или падает в рантайме. а после исправления КАЖДЫЙ вызов ЛЮБОГО метода находится в 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
Цитата Сообщение от Passerby Посмотреть сообщение
Ну так для этого и делаются промежуточные классы и интефейсы.
правильно, реализуйте вариант kolorotur и будет вам счастье. вроде сами понимаете, а делать не хотите.
Цитата Сообщение от Passerby Посмотреть сообщение
чтобы скрыть базовый метод или поле
насколько я знаю невозможно скрыть публичный метод/поле базового класса
Цитата Сообщение от Passerby Посмотреть сообщение
В чем отличие от интерфейса или промежуточного класса?
этоб был пример, почему нельзя вдруг скрыть метод базового класса
Цитата Сообщение от Passerby Посмотреть сообщение
И в чем отличие, как его будут скрывать: пометить словом или написав промежуточный класс?
это вы же предложили, вот и придумывайте. я лишь привел пример как сломается весь код, если разрешить скрывать методы

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


И вообще лучше объясните нормально что хотите создать, без абстрактных ABCD. Тогда можно будет на конкретном примере прийти к логичному решению
0
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
07.04.2019, 19:12  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
насколько я знаю невозможно скрыть публичный
Не только публичный, но и протектед.
Цитата Сообщение от КОП Посмотреть сообщение
я лишь привел пример как сломается весь код, если разрешить скрывать методы
Мне ваш пример непонятен. Если вы сделали класс в котором объявлены методы, поля, то в чем разница как вы решили скрыть что-либо: тем кто будут использовать этот класс без разницы как вы скрыли из-за чего и сломался их код: из-за введения промежуточного класса или просто применили новое ключевое слово. Я знаю, что такого слова нет: это видно из вопроса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2019, 19:12
Помогаю со студенческими работами здесь

Куда поместить функции?
Переписываю проект под ООП. У меня имеются мои самописные функции(защита от инъекций, проверка авторизованности пользователя, загрузка...

SDL: куда поместить библиотеку
Можете объяснить как установить sdl и кинуть (желательно на русском) туториалы для sdl на free pascal? сам скачал SDL.dll с...

Куда поместить файлы проекта?
Начал изучать php. Взял книгу, написал простенькое подобие интернет магазина. Получилась папка, в которой папка с изображениями, файлы...

Куда поместить код в конфигураторе?
Подскажите, куда вписывать код в конфигураторе? я просто только познакомился с 1с...

Куда поместить главные фотографии сайта?
Всем привет! Учусь работать с фотографиями на сайте. Понравился сайт http://www.annamaniamakeup.com/ Пробую ради интереса сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru