Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
.NET 4.x

Как принять в качестве аргумента, метод наследника

04.07.2022, 15:25. Показов 521. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Есть базовый класс (вообще он абстрактный, но здесь для примера показываю обычный)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Base
{
    protected string name;
    public Base() => name = Guid.NewGuid().ToString();
    public void Run(Action<Base> action)
    {
        Console.WriteLine("Run " + this.GetType().Name);
        Init();
        action(this);
        End();
    }
    private void Init() => Console.WriteLine("Init " + this.GetType().Name);
    private void End() => Console.WriteLine("End " + this.GetType().Name);
 
    public void Method1() => Console.WriteLine($"Method1 {name} " + this.GetType().Name);
    public void Method2() => Console.WriteLine($"Method2 {name} " + this.GetType().Name);
}
Можно вызывать вот так:
C#
1
new Base().Run(b => { b.Method1(); b.Method2(); b.Method1(); b.Method2(); });
Но если добавить наследника, и добавить метод наследнику, то это не работает

C#
1
2
3
4
public class Inheritor : Base
{
    public void Method3() => Console.WriteLine($"Method2 {name} " + this.GetType().Name);
}

Как можно принять в Run `public void Run(Action<Base> action)` методы наследников?

Чтобы можно было вызвать код вот так:
C#
1
new Inheritor().Run(b => { b.Method3(); b.Method2(); b.Method1(); });
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.07.2022, 15:25
Ответы с готовыми решениями:

Принять целое число в качестве аргумента, напечатать значение этого аргумента словами
Напишите программу, которая принимает целое число в качестве аргумента для вызова напечатает значение этого аргумента словами , например,...

Принять список целых чисел в качестве аргумента и напечатать среднее значение элементов этого списка
Напишите функцию print_average(arr), которая принимает список целых чисел в качестве аргумента и печатает среднее значение элементов этого...

Функция: принять список целых чисел в качестве аргумента и напечатать среднее значение его элементов
Напишите функцию print_average(arr), которая принимает список целых чисел в качестве аргумента и печатает среднее значение элементов этого...

5
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
04.07.2022, 15:35
C#
1
2
        new Base().Run<Base>(b => { b.Method1(); b.Method2(); b.Method1(); b.Method2(); });
        new Inheritor().Run<Inheritor>(b => { b.Method3(); b.Method2(); b.Method1(); });
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Base
{
    protected string name;
    public Base() => name = Guid.NewGuid().ToString();
    public void Run<T>(Action<T> action) where T : Base
    {
        Console.WriteLine("Run " + this.GetType().Name);
        Init();
        action((T)this);
        End();
    }
    private void Init() => Console.WriteLine("Init " + this.GetType().Name);
    private void End() => Console.WriteLine("End " + this.GetType().Name);
 
    public void Method1() => Console.WriteLine($"Method1 {name} " + this.GetType().Name);
    public void Method2() => Console.WriteLine($"Method2 {name} " + this.GetType().Name);
}
 
public class Inheritor : Base
{
    public void Method3() => Console.WriteLine($"Method3 {name} " + this.GetType().Name);
}
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.07.2022, 16:20
BeginnerCoderCS, если хочется строкой типизации, то либо делайте метод обобщенным и вместо this передавайте аргумент:
C#
1
public void Run<T>(Action<T> action, T argument) where T : Base
Либо делайте защищенный абстрактный метод и код определяйте в наследнике — вы по факту то же самое и пытаетесь сделать, только каким-то обходным путем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Base
{
    protected string name;
    public Base() => name = Guid.NewGuid().ToString();
    public void Run()
    {
        Console.WriteLine("Run " + this.GetType().Name);
        Init();
        Action();
        End();
    }
 
    protected abstract void Action();
 
    private void Init() => Console.WriteLine("Init " + this.GetType().Name);
    private void End() => Console.WriteLine("End " + this.GetType().Name);
 
    public void Method1() => Console.WriteLine($"Method1 {name} " + this.GetType().Name);
    public void Method2() => Console.WriteLine($"Method2 {name} " + this.GetType().Name);
}
 
public class Inheritor : Base
{
    protected override void Action() => { Method3(); Method2(); Method1(); }
    public void Method3() => Console.WriteLine($"Method2 {name} " + this.GetType().Name);
}
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
04.07.2022, 18:01  [ТС]
Второй способ не подходит, так как нужно гибко запускать определённые последовательности методов.



Цитата Сообщение от kolorotur Посмотреть сообщение
public void Run<T>(Action<T> action, T argument) where T : Base
А первый не пойму как вызывать?

Что в качестве аргумента передавать?

C#
1
new Inheritor().Run(x=> x.Method3());
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
04.07.2022, 18:12
C#
1
2
var i = new Inheritor();
i.Run(b => { b.Method3(); b.Method2(); b.Method1(); }, i);
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.07.2022, 18:14
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
нужно гибко запускать определённые последовательности методов.
Поскольку последовательность методов прописывается в коде, постольку это уже не гибко.
А раз все прописано в коде, то для каждой ситуации можно создать своего наследника и вместо разных лямбд создавать экземпляры разных типов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2022, 18:14
Помогаю со студенческими работами здесь

Как сделать так чтобы метод принимал в качестве аргумента экземпляр другого класса?
Как сделать так чтобы метод принимал в качестве аргумента экземпляр другого класса?

Передача матрицы в метод в качестве аргумента
Доброе время суток! Ребят забыл когда последний раз это делал, и вот косяки, ткните носом где я наложал! Код: #include...

Написать метод, который принимает такой массив в качестве аргумента
Помогите такое написать, прошууу, я не могу понять что к чему((( char tab = { {’S’ , ’a’ , ’m’ , ’s’ , ’u’ , ’n’ , ’g’ } , {’N’...

Метод, который принимает в качестве аргумента строку, содержащую английский текст
public class SplitText { public static void main(String args) { } public static String splitTextIntoWords(String text)...

Создать метод MyReverse, который принимает в качестве аргумента массив целочисленных элементов
1) Создать метод MyReverse(int array), который принимает в качестве аргумента массив целочисленных элементов и возвращает инвертированный...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru