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

Реализация абстрактного метода без создания класса-наследника, как в JAVA

10.10.2019, 17:40. Показов 5116. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В JAVA есть такая фича: реализация абстрактного метода при создании экземпляра.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstract class Base {
  abstract public void Run();
}
 
public static void main() {
   Base obj1 = new Base() {
        @Override
        public void Run() {
            // Реализация метода исключительно для объекта obj1
        }
   }
 
  obj1.Run();
}
А есть-ли подобная фича на C#? Или мне обязательно нужно создавать наследника для переопределения абстрактного метода?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2019, 17:40
Ответы с готовыми решениями:

Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника
Добрый день. Подскажите как обратиться из конструктора базового абстрактного класса к свойству-массиву из класса наследника. Вроде бы...

Как достучатся до полей и методов наследника абстрактного класса?
Начал писать игру "бомбермен". Создал абстрактный класс Ячейка (abstract class Cell). От ячейки отнаследовал классы. class...

Вызов переопределенного метода класса наследника из базового класса
Предположим есть два класа: public class A { /* ... некая дополнительная реализация.... */ ...

11
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
10.10.2019, 17:49
И зачем эта фича нужна?
Зачем для каждого отдельного экземпляра определять свой собственный метод?

Просто определите метод, принимающий делегат и вызывайте этот делегат внутри.

ps: реализация из коробки от java выглядит как "А *авно то с орехами!"
0
1 / 1 / 0
Регистрация: 09.10.2019
Сообщений: 15
10.10.2019, 18:04  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
И зачем эта фича нужна?
Если Вам интересно, пожалуйста: есть абстрактный класс, в котором полностью реализован весь функционал. Наследники переопределяют метод проверки введенных значений и метод формирования xml. Эти методы уникальны для каждого экземпляра и не переиспользуются в приложении. Согласно архитектурной задумке, поведение этих методов уникально для каждого экземпляра и не может быть сведено к универсальным методам.

Определить делегат в данном случае не лучше создания наследников (у которых заведомо будет не больше одного объекта) .

P.S.
На счет А *авно то с орехами ": Спасибо. Я понял Ваше отношение и Ваше воспитание.
0
10.10.2019, 18:10

Не по теме:

Цитата Сообщение от mikekon Посмотреть сообщение
Согласно архитектурной задумке, поведение этих методов уникально для каждого экземпляра и не может быть сведено к универсальным методам
по моему, хрень какая то

0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
10.10.2019, 18:12
Цитата Сообщение от mikekon Посмотреть сообщение
Наследники переопределяют метод проверки введенных значений и метод формирования xml. Эти методы уникальны для каждого экземпляра и не переиспользуются в приложении. Согласно архитектурной задумке, поведение этих методов уникально для каждого экземпляра и не может быть сведено к универсальным методам.
передавайте классу предикат, например через конструктор, и вызывайте в месте проверки.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
10.10.2019, 18:21
Цитата Сообщение от mikekon Посмотреть сообщение
Наследники переопределяют метод проверки введенных значений и метод формирования xml
ООП дизайн в контексте иерархии типов подразумевает, что переопределенное поведение относится ко всему типу целиком.
А не к его экземплярам.
Вы же сами пишете:
Цитата Сообщение от mikekon Посмотреть сообщение
Наследники переопределяют метод проверки введенных значений и метод формирования xml
Без знания вашей хотелки любой читающий это сделает вывод про стандартное переопределение типа.

Цитата Сообщение от mikekon Посмотреть сообщение
Согласно архитектурной задумке, поведение этих методов уникально для каждого экземпляра и не может быть сведено к универсальным методам.
Если есть внешняя зависимость в контексте вызова метода, то эта зависимость передается в виде параметра в коде.
Даже логику можно передать параметром в виде делегата - C# это позволяет.

А если java это не позволяет, то это проблема языка, его объективная реальность, а не проблема воспитания.
Оттуда и орехи..
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.10.2019, 18:21
Лучший ответ Сообщение было отмечено mikekon как решение

Решение

Цитата Сообщение от mikekon Посмотреть сообщение
А есть-ли подобная фича на C#? Или мне обязательно нужно создавать наследника для переопределения абстрактного метода?
Нет, в шарпе надо создавать наследника.
Но здесь это и не требуется, т.к. имеются делегаты — товарищ КОП выше пояснил как ими пользоваться.

Цитата Сообщение от IamRain Посмотреть сообщение
И зачем эта фича нужна?
Это поддержка анонимных типов, которые могут наследоваться от определенного класса или реализовывать определенный интерфейс — очень удобно, особенно в отсутствие делегатов.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
10.10.2019, 18:39
Цитата Сообщение от kolorotur Посмотреть сообщение
Это поддержка анонимных типов
Смахивает чем-то уже на js-овское переопределение членов. Когда в функции-конструкторе наследника можно затирать свойства родителя.
JavaScript
1
2
3
4
5
6
function Derived() {
   // мы не устанавливаем свойство родителя, а определяем собственное свойство наследника,
   // именно на уровне экземпляра
   // хотя можно и в прототипе
   this.name = "Derived";
}
А у js-а, как известно, не особо с ООП-то вышло.

Добавлено через 57 секунд
Отсюда и отторжение к java.
0
1 / 1 / 0
Регистрация: 09.10.2019
Сообщений: 15
10.10.2019, 18:45  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
передавайте классу предикат, например через конструктор, и вызывайте в месте проверки.
Это понятно. Спасибо. В конце концов, придется так и сделать.

Нет, значит нет. Появится в будущих версиях...

Закрываю тему, а то сейчас будет религиозная война. Тут вон уже JS подтянулся
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
10.10.2019, 18:52
Цитата Сообщение от mikekon Посмотреть сообщение
Появится в будущих версиях.
Да не появится, это просто тут не нужно, как-то изголяться, придумывать tricks, чтобы добиться похожего функционала.
Я сам начинал карьеру с java, но после 4 месяцев сознательно пересел.
Объективно вещи, которые лучше:
1. Стройная иерархия типов
2. Крутая IDE
3. Хорошая документация
4. Динамичное развитие платформы
Да, шарп спер идею у java, и ,переработав, сделал лучшую реализацию, имхо (деталей не знаю). По крайней мере, уже можно судить по созданной теме.
И со стороны jvm, насколько я знаю, java уже не так популярен, есть kotlin..
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.10.2019, 18:58
Цитата Сообщение от IamRain Посмотреть сообщение
Смахивает чем-то уже на js-овское переопределение членов.
Не совсем, просто позволяет задавать конкретный тип переменной анонимного объекта.
Там же нет делегатов, потому многое реализовано через интерфейсы — те же события, например.
Если в шарпе в качестве обработчика можно запилить анонимный метод button.Click += (o, e) => { ... } или даже при наличии полноценного метода так: button.Click += OnClick;, то в джаве Click — это, грубо говоря, свойство интерфейсного типа interface ClickHandler { void handle(Object sender, EventArgs e); } (на деле — список ссылок на интерфейсы, конечно).

Через это создатели джавы сжалились над пользователями и позволили создавать одноразовые реализации интерфейсов:
Java
1
2
3
4
5
6
7
button.Click = new ClickHandler()
{
   public void handle(Object sender, EventArgs e)
   {
      ...
   }
}
Альтернативный вариант — реализовывать интерфейс на классе, в котором производится подписка — это будет равносильно использованию полноценного метода при подписке на событие в шарпе:
Java
1
2
3
4
5
6
7
8
9
10
11
class MyForm extends Form implements ClickHandler
{
   public MyForm()
   {
      button.Click = this; // Подписка на событие
   }
 
   public void handle(Object sender, EventArgs e)
   {
   }
}
Добавлено через 45 секунд
Цитата Сообщение от IamRain Посмотреть сообщение
Я сам начинал карьеру с java
А, ну тогда вы тем более в курсе.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
10.10.2019, 20:09
Цитата Сообщение от IamRain Посмотреть сообщение
Когда в функции-конструкторе наследника можно затирать свойства родителя.
Оно кладётся поверх, если свойство было в прототипе. А если смотрим на экземпляр, то уже интереснее ))
Цитата Сообщение от IamRain Посмотреть сообщение
А у js-а, как известно, не особо с ООП-то вышло.
Мне как-то даже немного обидно стало. Распинался-распинался сегодня на тему различий inner и nested классов...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.10.2019, 20:09
Помогаю со студенческими работами здесь

Как компилятор различает две перегрузки метода абстрактного класса в инстанцированном классе потомке?
using System; namespace ConsoleApp1 { public abstract class cl<T> { public abstract void m(int a); public...

Создание абстрактного класса и метода
Помогите пожалуйста!! Нужно создать абстрактный класс, потом добавить в базовый абстрактный класс по одному общему в производных классах...

Реализация методов абстрактного класса
Суть задания реализация перевода введенной суммы гривен в другие валюты(рубли,евро, доллар) Выводит по нулям, но как задать курс? Код: ...

Реализация абстрактного класса для арифметических операций
Всем привет. Меня интересует вопрос о создании абстрактного класса. Скажу сразу что с этой концепцией я знаком, и даже как то применял ( в...

Присвоить переменной тип абстрактного класса для последующего создания
Суть проблемы в классе House. Мы в цикле каждый раз делаем проверку какой класс создавать Dog или Cat. Я бы хотел проводить проверку 1...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru