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

Использование в производных классах методов базового класса с другой сигнатурой

28.10.2020, 17:28. Показов 1595. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос можно и как-то шире ставить наверное.
Суть в чем. Есть базовый класс. У него есть классы потомки.
При этом известно, что у каждого класса потомка должен быть некий метод определенной функциональности. Причем, все эти методы потомков функционально схожи (и потому их имеет смысл назвать одинаково), но имеют разную сигнатуру - по числу и типам параметров.
Можно ли средствами c# задать такой метод в базовом классе?
То есть определить, что метод с таким именем должен быть определен в каждом классе потомке с соответствующей данному потомку сигнатурой. Имя одно и то же, а сигнатуры разные.
Можно конечно просто определять их в классах потомках (а базовом его не будет). Но логично прописать такое требование в базовом классе - чтобы в каждом классе потомке был метод с таким именем.
Но как?
Интерфейсы тоже требуют конкретизации сигнатуры.
Никак?

Добавлено через 1 минуту
P.S. Не правильно тему назвал
Надо было как-то по другому. Может модератор исправит?)
Типа - "Как задать в базовом классе требование необходимости создания в каждом классе потомке метода с одним и тем же именем, но другой сигнатурой".

Добавлено через 7 минут
Наверное, проще всего уйти от параметров вовсе - использовать поля класса. Тогда в базовом абстрактном классе можно сделать абстрактный метод без параметров и его переопределять в каждом потомке.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2020, 17:28
Ответы с готовыми решениями:

Переменная базового класса в производных классах
Есть абстрактный базовый класс и в нем определена переменная variable: class Base { public: int variable; }; И есть...

Как получить информацию о производных классах базового класса A
Доброе время суток! Подскажите как получить информацию о производных классах (B, C, D), базового класса A а потом изменить их...

Как не инициировать поля базового класса в его производных классах?
У меня есть базовый класс, от него идут несколько производных классов, от которых, в свою очередь, идут свои производные классы. Набросал...

14
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
28.10.2020, 17:32
Цитата Сообщение от titan4ik Посмотреть сообщение
Наверное, проще всего уйти от параметров вовсе - использовать поля класса. Тогда в базовом абстрактном классе можно сделать абстрактный метод без параметров и его переопределять в каждом потомке.
имхо, да, так правильно
1
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
28.10.2020, 17:48
titan4ik, Предложу свой велосипед:
Засунуть передаваемые параметры в отдельный класс, что-то вроде:

C#
1
2
3
4
5
public abstract class MyAwesomeOptions // или не abstract, если там немного опциональных параметров и мусорка  
// не  получится
{
    // Some code
}

C#
1
public abstract void Method(MyAwesomeOptions options);
И там уже вертите эти опции на чем хотите. Наследуйте, делайте фабрики и т.д.

Добавлено через 7 минут
Цитата Сообщение от titan4ik Посмотреть сообщение
Наверное, проще всего уйти от параметров вовсе - использовать поля класса. Тогда в базовом абстрактном классе можно сделать абстрактный метод без параметров и его переопределять в каждом потомке.
Тогда Вам нужно будет обеспечить заполнение и валидность всех этих полей при вызове конструктора. Иначе есть вероятность упасть при вызове Вашего метода, если какое-то поле не заполнено, и для программиста, использующего Ваш код, будет не очевидно в чем ошибка. Т.к. он не обязан иметь представление о внутреннем устройстве Вашего класса. Мол, все правильно сделал, экземпляр класса создался, а метод не работает.
1
Заблокирован
28.10.2020, 17:54  [ТС]
Цитата Сообщение от aenye Посмотреть сообщение
передаваемые параметры в отдельный класс
Понятно. Но тогда придется для каждого класса потомка делать ещё конкретизацию этого класса, содержащего параметры.
Короче, если первый простой способ не катит (отсутствие параметров), то тогда модно пойти этим путем.
aenye, фактически все используют этот ваш способ, не оч задумываясь об этом (и я тоже), когда имеют дело с событиями и их стандартными обработчиками - для конкретизации класса данных события - наследника от базового EventArgs.

Добавлено через 1 минуту
Цитата Сообщение от aenye Посмотреть сообщение
Тогда Вам нужно будет обеспечить заполнение и валидность всех этих полей при вызове конструктора.
Спасибо. Но в моем случае эти поля вычисляемые внутри класса.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.10.2020, 18:19
Цитата Сообщение от titan4ik Посмотреть сообщение
Типа - "Как задать в базовом классе требование необходимости создания в каждом классе потомке метода с одним и тем же именем, но другой сигнатурой".
Цитата Сообщение от titan4ik Посмотреть сообщение
Спасибо. Но в моем случае эти поля вычисляемые внутри класса.
Изменять сигнатуру метода при переопределении нельзя.
Если сигнатура другая, то будет добавлена новая перегрузка метода.

Для подобных ситуаций используются различные приёмы и их применимость зависит от конкретной задачи.
Не могли бы вы на простых примерах в коде продемонстрировать, что вам надо реализовать?
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
28.10.2020, 18:22
Цитата Сообщение от titan4ik Посмотреть сообщение
Но в моем случае эти поля вычисляемые внутри класса
я не понел. а зачем тогда вообще планировались параметры в метод, если это вычисляемые поля внутри класса?
0
Заблокирован
28.10.2020, 18:31  [ТС]
Элд Хасп, да я уже в моем конкретном случае разобрался - сейчас разбираюсь как сделать логичнее и красивше. В принципе понятно, что способов много.
Но было интересно - а вдруг такие средства у c# есть.
Цитата Сообщение от valera_21 Посмотреть сообщение
я не понел. а зачем тогда вообще планировались параметры в метод, если это вычисляемые поля внутри класса?
Да может для наглядности или по глупости) Не помню уже. Провожу "рефакторинг") Убираю вопиющие "некрасивости".
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
28.10.2020, 18:53
Цитата Сообщение от titan4ik Посмотреть сообщение
а вдруг такие средства у c# есть.
C#
1
public abstract void SomeFunc(params object[] parameters);
0
Заблокирован
28.10.2020, 18:56  [ТС]
valera_21, ну, да) Но... object это же не комильфо без крайней нужды)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.10.2020, 19:03
Цитата Сообщение от titan4ik Посмотреть сообщение
В принципе понятно, что способов много.
Но было интересно - а вдруг такие средства у c# есть.
Всё равно будет удобнее разбирать на каких-то примерах, именно по причине огромного количества различных реализацией и всех очень зависимых от условий задачи.

Создайте 2-3-5 примеров с кодом.
Подход к решению которых вам может быть полезен.
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
28.10.2020, 19:08
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не могли бы вы на простых примерах в коде продемонстрировать, что вам надо реализовать?
У данного ТС никогда не бывает кода, все вопросы строятся на теории
titan4ik, показывайте конкретный код, где возник вопрос. учитывая данную тему - можно сказать что наследование или не нужно, или сделано неправильно, или использовать перегрузку методов. Все остальное - костыли.
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
28.10.2020, 19:14
Цитата Сообщение от Enifan Посмотреть сообщение
можно сказать что наследование или не нужно, или сделано неправильно,
Похоже на то

Цитата Сообщение от Enifan Посмотреть сообщение
Все остальное - костыли
Слишком категорично в данном случае, на мой взгляд

Цитата Сообщение от Enifan Посмотреть сообщение
или использовать перегрузку методов
Тоже в костыли можно записать.
Если все перегрузки абстрактные, а реализовать в потомке нужно только одну - придется NotImplementedException городить для остальных.
А если сделать их виртуальными - абстрактный класс может попросту не знать что в них делать нужно, и тут тоже либо заглушка, либо NotImplementedException.
0
Заблокирован
28.10.2020, 19:23  [ТС]
Ребята, вопрос был о синтаксисе языка, а не о моей конкретной проблеме. Просто подумал, а вдруг я чего-то не знаю (или забыл) простого базового.
А свою проблему я решу одним из многих понятных способов. Всем спасибо. Обсуждение помогло мне сориентироваться.
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
28.10.2020, 19:24
Цитата Сообщение от aenye Посмотреть сообщение
в данном случае
Тут как такового случая и нет (я про код)
Цитата Сообщение от aenye Посмотреть сообщение
Тоже в костыли можно записать.
Смотря где и как использовать перегрузку. Напортачить можно где угодно
Цитата Сообщение от aenye Посмотреть сообщение
Если все перегрузки абстрактные
А зачем они тогда нужны ? Вот примел, что я имел ввиду, никаких проблем не будет и эксепшены не нужны
C#
1
2
3
4
5
6
7
8
9
10
11
class A
{
    public virtual void Foo(int a) { }
}
 
class B : A
{
    public override void Foo(int a) { }
    
    public void Foo(int a, int b) { }
}
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
28.10.2020, 19:30
Цитата Сообщение от Enifan Посмотреть сообщение
А зачем они тогда нужны ?
Вот и я о том же)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2020, 19:30
Помогаю со студенческими работами здесь

Реализовать абстрактные функции-члены абстрактного базового класса в производных классах
1. Определить иерархию классов 2. Определить и построить абстрактный класс, который содержит: абстрактные методы, абстрактные свойства,...

Рефлексия. Нужно красивое решение для работы в производных классах со статическими членами базового класса
Демонстрационный код для объяснения задачи. Базовый класс и два производных от него: public class BaseClass<T> { ...

Реализация чистых виртуальных методов в производных классах
Здравствуйте! Интересует такой вопрос: Допустим, имеется у нас базовый абстрактный класс и несколько производных от него классов. В...

Занести из файла объекты производных классов в массив объектов базового класса
Здравствуйте. Что в этом коде изменить, чтобы объекты производных классов заносились из файла? using System; namespace...

Возможно ли некоторые публичные члены базового класса закрыть для производных классов?
Т.е. чтобы некоторые члены были доступны из экземпляра базового класса, но чтобы их невозможно было вызвать из экземпляров производных?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru