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

Написать код с использованием событий и делегатов

08.01.2012, 19:33. Показов 1699. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, как правильно реализовать следующую задачу:

Есть класс Man:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Man
    {
        public Man(string _name)
        {
            Name = _name;
            Console.WriteLine("New Man was Born!");
        }
        
        private string Name;
 
        private string DisplayName
        {
            get { return Name; }
            set { Name = value; }
        }
 
        public void RenameMan(string _newname)
        {
            DisplayName = _newname;
        }
 
 
    }
Есть класс Boss:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class Boss
    {
        private string Name;
 
        public Boss(string _name)
        {
            Name = _name;
        }
 
        public void SayWow()
        {
            Console.WriteLine("{0} say: WOW", Name);
        }
 
    }
Ну и набросок самой программы:

C#
1
2
3
4
5
6
            Man Sasha = new Man("Sasha");
            Boss MyBoss = new Boss("MyBoss");
            
            Sasha.RenameMan("Masha");
            
            Console.ReadKey();
Хочу, чтобы всякий раз после выполнения метода RenameMan (класса Man), экземпляр класса (все экземпляры) Boss "говорил" "Wow!" (выполнялся метод SayWow() ). Пожалуйста, научите
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2012, 19:33
Ответы с готовыми решениями:

Игра "Такси" с использованием делегатов и событий
Суть задачи: Используя делегаты и события написать игру по следующему сценарию: Игра «Такси». Два круга начинают движение слева к центру...

Получения событий без делегатов
Как получить события в C# Console Application без использования делегатов?

Применение делегатов в качестве обработчиков событий
Реализовать собственное событие (имитация) нажатие клавиш мыши или клавиатуры. Разработать событием на основе стандартного события и...

4
Jawa
08.01.2012, 23:28
Пока решил это вот таким способом:

Класс Man:

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
27
28
29
30
31
    public class Man
    {
        public Man(string _name)
        {
            Name = _name;
            Console.WriteLine("New Man {0} was Born!", _name);
        }
        
        private string Name;
 
        public event EventHandler ManRenamed;
 
        private string DisplayName
        {
            get { return Name; }
            set 
            { 
                Name = value;
                if (ManRenamed != null) ManRenamed();
            }
        }
 
        public void RenameMan(string _newname)
        {
            string oldname = DisplayName;
            Console.WriteLine("{0} was renamed. It now {1}", oldname, _newname);
            DisplayName = _newname;
        }
 
 
    }
Сама программа:

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
    public delegate void EventHandler();
 
 
    class Program
    {
 
        static void Main(string[] args)
        {
            Man Sasha = new Man("Sasha");
            Boss MyBoss = new Boss("MyBoss");
 
            Sasha.ManRenamed += new EventHandler(MyBoss.SayWow);
            
            Sasha.RenameMan("Masha");
            Sasha.RenameMan("Pasha");
 
            Sasha.ManRenamed -= new EventHandler(MyBoss.SayWow);
 
            Sasha.RenameMan("SuperMan");
 
            Console.ReadKey();
 
        }
    }
Что получилось - во вложении.

А можно ли сделать так, чтобы объекты были подписаны на определённые события "при рождении", а не вручную, как сделано выше (Sasha.ManRenamed -= new EventHandler(MyBoss.SayWow))? Например, все экземпляры класса Boss будут "говорить" "WOW" при переименовании любого из экземпляра класса Man (под "переименованием" имею ввиду вызов метода RenameMan).

Хотелось бы услышать более правильные приёмы решения этой задачи (если таковые имеются). Спасибо!
Изображения
 
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995
09.01.2012, 14:09
У меня даже не вышло повторить, но чисто по логике, возможно проще сделать клас WOW, который и применять при конкретном действии, при вызове некоего класса?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.01.2012, 16:02
Как ты решил, если оно не компилится. Или у тебя какой-то другой C#?

Добавлено через 18 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Man
    {
        //--------
        //--------
        public void RenameMan(string _newname)
        {
            string oldname = DisplayName;
            Console.WriteLine("{0} was renamed. It now {1}", oldname, _newname);
            DisplayName = _newname;
        }
        //--------
        //--------
    }
Вообще по сути объекты не должны ничего "знать" о консоли. А если не в консоли будешь использовать объекты?

Добавлено через 1 минуту
И стиль именования у тебя какой-то с ног на голову. Я про то, с какого регистра начинаются те или иные слова и слова начинающиеся с прочерка.

Добавлено через 15 минут
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
27
28
29
30
31
32
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static Boss myBoss;
 
        static void Main(string[] args)
        {
            Man sasha = new Man("Саша");
            myBoss = new Boss("Бос");
 
            sasha.Renamed += new EventHandler<NameEventArgs>(Sasha_Renamed);
 
            sasha.Name = "Маша";
            sasha.Name = "Паша";
            sasha.Name = "Супер мэн";
 
            sasha.Renamed -= new EventHandler<NameEventArgs>(Sasha_Renamed);
            sasha.Name = "Это имя не отобразится на консоли";
 
            Console.ReadKey();
        }
 
        static void Sasha_Renamed(object sender, NameEventArgs e)
        {
            myBoss.SomeMethod(); //думаю важно, чтобы вызывать метод какой-то у боса, а не именно говорить WOW!
            Console.WriteLine("Предыдущее имя: \"{0}\", новое имя \"{1}\"", e.PreviousName, e.NewName);
        }
    }
}
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
27
28
29
    public class Man
    {
        protected string _name;
 
        public Man(string name)
        {
            _name = name;
        }
 
        /// <summary>Происходит при изменении имени</summary>
        public event EventHandler<NameEventArgs> Renamed;
 
        public string Name
        {
            get { return _name; }
            set
            {
                string prevName = _name;
                _name = value;
                OnRename(value, prevName);
            }
        }
 
        private void OnRename(string value, string prevName)
        {
            if (Renamed != null) 
                Renamed(this, new NameEventArgs(prevName, value));
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
    public class Boss : Man
    {
        public Boss(string name)
            :base(name)
        {
        }
 
        public void SomeMethod()
        {
        }
    }
0
8 / 8 / 6
Регистрация: 14.06.2013
Сообщений: 65
09.11.2014, 15:34
Не знаю или нормальный способ, просто недавно начал учить делегаты
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//обьявим делегат, который ничего не возвращает и не принимает(в соответсвии с методом SatWot) чтобы сделать далее событие
 
 public delegate void Deleg(); 
 public class Man
    {
        private string Name;
        public event Deleg SayW; //обьявляем событие
        
        private string DisplayName
        {
            get { return Name; }
            set { Name = value; }
        }
 
        public void RenameMan(string _newname)
        {
            DisplayName = _newname;
            
//Если событие имеет ссылку на метод(это просто меры предосторожности) то тогда выводить следующие:
 
           if (SayW != null)             
           {
                Console.WriteLine("{0}", SayW.Target.ToString()); SayW();
            }
        }
        
        public Man(string _name)
        {
            Name = _name;
            Console.WriteLine("New Man was Born!");
        }
    }
    class Boss
    {
        private string Name;
        
        public void SayWow()
        {
            Console.WriteLine("{0} say: WOW", Name);
        }
 
        public override string ToString()
        {
            return String.Format("Instance of class Boss have name is {0}", Name); //тут просто так переопределил метод ToString чтобы событие выбивало имя класса, это я так, для себя)))
        }
 
        public Boss(string _name)
        {
            Name = _name;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Man Sasha = new Man("Sasha");
            Boss MyBoss = new Boss("MyBoss");
            Sasha.SayW += MyBoss.SayWow;//подпись на событие, чтобы оно работало в методе
            Sasha.RenameMan("Masha");
            Console.ReadKey();
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2014, 15:34
Помогаю со студенческими работами здесь

Применение делегатов в качестве обработчиков событий
Реализовать собственное событие (имитация) нажатие клавиш мыши или клавиатуры. Разработать событием на основе стандартного события и...

Хочу написать приложение на JavaFX, с использованием контроллера и событий. Куда делся controller?
Всем здрасьте. С Java только знакомлюсь. Хочу написать приложение на JavaFX, с использованием контроллера и событий. Прочитал...

Нужен пример с использованием делегатов
Использовать делегаты Func и Exction

Вычисление значений выражений с использованием делегатов
Вычислить значение функции f(x), для введенного пользователем х. ∑a_i – это сумма всех целых чисел до x. f(x) ={x}^{2} *\sum ai ...

Вычислить значение функции с использованием делегатов
Делегаты. Вычислить значение функции f(x), для введенного пользователем х: F(x)=3x+7. Модифицировать программу для вычисления следующей...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
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 и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru