Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49

Организация событий между классами

04.01.2017, 12:23. Показов 7484. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс записи в файл, писать необходимо из экземпляров _a, _b, но из этих экземпляров нет доступа к
экземпляру log3, приходиться создавать в каждом классе свои экземпляры log1 и log2 - что не есть правильно
мне так кажется, как правильно все таки сделать посоветуйте пожалуйста?
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
 public delegate void LOGHandler(TypeLog a, string mes);
class A
{  
   event LOGHandler LogEvent;
        public void SaveLOG(TypeLog type, string mes)
        {
                if (LogEvent == null)
                {
                LOGING log1 = new LOGING();
                    LogEvent += new LOGHandler(log1.LOGevent);
                }
                LogEvent(type, mes);
        }
}
 
class B
{
event LOGHandler LogEvent;
        public void SaveLOG(TypeLog type, string mes)
        {
                if (LogEvent == null)
                {
                LOGING log2 = new LOGING();
                    LogEvent += new LOGHandler(log2.LOGevent);
                }
                LogEvent(type, mes);
        }
 
}
 
class MAIN
{
  A _a;  B _b;   
  LOGING log3 = new LOGING();
}
 
class LOGING
{
  public void LOGevent(TypeLog type, string mes)
  {
  //код записи в файл
  }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2017, 12:23
Ответы с готовыми решениями:

Отношения между классами
Ребята, всем привет!!! Мне очень нужна ваша помощь!!! Необходимо разработать класс Car. Добавить в класс 3 поля: марка автомобиля, цвет...

Связи между классами
Всем привет:) Друзья подскажите пожалуйста если Я передаю обьект в метод, какая это связь? public void Method(MyClass my) // какая...

Передача между классами
Имеются 2 класса Kisti.cs и Form1.cs Вот содержимое Kisti.cs: class Kisti { public static Pen Black = new...

41
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
05.01.2017, 19:14
Лучший ответ Сообщение было отмечено dav1977 как решение

Решение

Студворк — интернет-сервис помощи студентам
Это условно, но он не статический.
Можно вот так передавать параметры:
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
class Program
    {
        static void Main(string[] args)
        {
            Singleton.Instance.WriteLogs("HELLO");
 
            Console.ReadKey();
        }
    }
    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazy =
            new Lazy<Singleton>(() => new Singleton());
 
        public static Singleton Instance { get { return lazy.Value; } }
 
        public void WriteLogs(string log)
        {
            Console.WriteLine(log); // Запись в файл
        }
 
        private Singleton()
        {
        }
    }
1
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
05.01.2017, 19:49
dav1977,

Евенты нужны в тех ситуациях, когда обьект-хост не знает и знать не может о возможных слушателях.

И на каком основании вы решаете хороша ли статика или нет?) Именно благодаря статике вы сможете получить возможно обращаться к ОДНОМУ И ТОМУ ЖЕ обьекту "откуда вы хотите";

Вы изначально выбрали неверную архитектуру, а потом сделали вывод в том что евенты вообще не нужны.
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 20:05  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
И на каком основании вы решаете хороша ли статика или нет?
на основании моего вопроса в топике, надо было бы в статике и вопроса бы не было,
это суть вопроса сделать передачу данных между не статическими классами.
Для этого events придумали, и сингелтон
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
05.01.2017, 20:15
Цитата Сообщение от dav1977 Посмотреть сообщение
сингелтон
Я вам об этом в самом начале писал, что к вашей задаче больше подойдет либо статический класс который будет иметь функцию записи, либо синглтон.

ПС. Синглтон это патерн, который создает статический обьект, если уж вы так "статику" не любите.

Добавлено через 6 минут
Если уж на то пошло.

Это код от 1231231ghacking


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> lazy =
            new Lazy<Singleton>(() => new Singleton());
 
        public static Singleton Instance { get { return lazy.Value; } }
 
        public void WriteLogs(string log)
        {
            Console.WriteLine(log); // Запись в файл
        }
 
        private Singleton()
        {
        }
    }
А это точно такая же реализация через статический класс

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class Logger
{
    public static void WriteLogs(string log)
        {
            Console.WriteLine(log); // Запись в файл
        }
}
 
......
 
static void Main(string[] args)
        {
              Logger.WriteLogs("123");
        }
Никакой разницы в скорости выполнения операции вы не увидите.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2017, 20:26
Цитата Сообщение от dav1977 Посмотреть сообщение
суть вопроса сделать передачу данных между не статическими классами.
dav1977, ятд, вы не улавливаете сути.
1. События используются, как правило, в том случае, когда класс-слушатель ожидает получения данных, не предпринимая попыток их получить. То есть, данные предоставляются кем-то извне, и момент их получения (или их НЕ получения) от класса не зависит. Класс просто ожидает получения данных. Пришли - обработал, нет - значит издатель ничего не отправлял.
2. Статический класс (либо синглет) принято использовать в том случае, когда в приложении есть общие данные, которые необходимо передавать между объектами. В этом случае классы (объекты) сами обращаются за данными к общему хранилищу (статический класс/синглет) и сами их туда записывают.
Что использовать в каждом конкретном случае - зависит от логики работы программы, и каждый принимает решение сам, исходя из своих требований.
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 20:34  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Никакой разницы в скорости выполнения операции вы не увидите.
дело не в скорости, а в наследовании
статику я не люблю потому что, я не могу наследовать статический класс и сингелтон тоже наверное
а мне надо чтобы класс логирования был наследником от не статического класса с данными,
в это суть вопроса НЕ СТАТИЧЕСКИМИ данными Лучше сингелтона я пока не вижу
на events не возможно сделать, может что-то лучше есть чем сингелтон?

Добавлено через 8 минут
Цитата Сообщение от insite2012 Посмотреть сообщение
Статический класс (либо синглет) принято использовать в том случае, когда в приложении есть общие данные, которые необходимо передавать между объектами.
а вот так делать нельзя как учат в учебниках, нарушаются принципы ООП
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
05.01.2017, 20:46
Класс Singleton можно наследовать, если нужно, приведу пример
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2017, 20:47
Цитата Сообщение от dav1977 Посмотреть сообщение
вот так делать нельзя как учат в учебниках
Да вы что??? Правда? Синглет, между прочим, тоже является одним из паттернов, про который рассказывают эти самые учебники. Диссонанс, однако.
Цитата Сообщение от dav1977 Посмотреть сообщение
нарушаются принципы ООП
Чем именно?
Вот вам реальный пример. Есть форма, при нажатии некой сферической кнопки нужно создать класс-наследник (через фабрику). Конкретный тип того класса, который нужно создать, хранится в синглете, свойства которого устанавливаются совершенно другой формой и в произвольное время. Сам синглет сериализуется в файл и читается из него.
Вопрос: при вызове формы с настройками, где нам сохранить тип класса, который будет создан в будущем (а может и не будет, если кнопку не нажать)?
Если следовать вашей логике, то нам надо создать событие в форме настроек, а в основной форме на него подписываться. Но! В таком случае мы получаем две жестко связанных формы, работа которых по отдельности уже невозможна. С тем же подходом, что я указал выше, мы имеем совершенно независимую форму с настройками, которую запросто сможем использовать (с небольшими корректировками) в каком угодно приложении.
Разницу замечаете? Вы каждый раз пишете велосипед, а я написал раз и использую тогда и там, когда мне это нужно, с минимумом переделок.
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 21:09  [ТС]
Цитата Сообщение от 1231231ghacking Посмотреть сообщение
Класс Singleton можно наследовать, если нужно, приведу пример
очень просим... за спасибо

Добавлено через 8 минут
Цитата Сообщение от insite2012 Посмотреть сообщение
Чем именно?
Инкапсуля́ция Пользователь может взаимодействовать с объектом только через интерфейс.

Добавлено через 4 минуты
Цитата Сообщение от insite2012 Посмотреть сообщение
Если следовать вашей логике
Я ни на чем не настаиваю, у меня есть задача я ищю красивую архитектуру для ее решения, а вы
мне статику предлагаете в условии задачи статику нельзя использовать, так скажите что задача
не решаемая
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
05.01.2017, 21:24
Лучший ответ Сообщение было отмечено dav1977 как решение

Решение

Собственно,вот:
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
    class Program
    {
        static void Main(string[] args)
        {
           Console.WriteLine(TestClass.Instance.TestProc());
           Console.ReadKey();
        }
 
    }
    public class Singleton<T> where T : class, new()
    {
        protected Singleton() { }
 
        private sealed class SingletonCreator<S> where S : class, new()
        {
            private static readonly Lazy<S> lazy = new Lazy<S>(() => new S());
 
            public static S CreatorInstance
            {
                get { return lazy.Value; }
            }
        }
 
        public static T Instance
        {
            get { return SingletonCreator<T>.CreatorInstance; }
        }
 
    }
 
    public class TestClass : Singleton<TestClass>
    {
        public string TestProc()
        {
            return "Hello World";
        }
    }
Добавлено через 14 минут
Всегда рад помочь, надеюсь, вам помог пример решить вашу проблему
1
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
05.01.2017, 21:46
Цитата Сообщение от dav1977 Посмотреть сообщение
а вот так делать нельзя как учат в учебниках, нарушаются принципы ООП
Где? Покажите? Статические классы\методы использются ровно на столько на сколько это необходимо в рамках конкретной задачи.

Вам стоит немного натаскать себя в алгоритмическом мышлении, тога подобный фраз о нарушении ООП и прочей ерунде типа наследование от синглета в котором класс который будет выполнять логирование, который тоже должен откуда то наследоваться возникать не будет.
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
05.01.2017, 22:19  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Где? Покажите?
если есть 2 класса и у них есть статический общий класс, в котором храняться данные 2х этих классов,
смысл тогда этих 2х классов? Инкапсуля́ция где? Где целостность данных их бесопастность, делайте тогда один класс да и все.
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
06.01.2017, 01:52
Лучший ответ Сообщение было отмечено dav1977 как решение

Решение

Кхм... "смешались в кучу кони, люди"...

dav1977, давайте ещё раз, чтобы и мне, и другим читателям было понятно. Вам нужно решение следующей задачи: есть класс SomeClass, для которого создаются несколько экземпляров (от 1 до пока не надоест), и с этими экземплярами в какой-то момент времени выполняется какое-то действие, которое необходимо залогировать, причём все классы должны быть экземплярными (надеюсь, это именно то, что Вы хотите получить в итоге)?

Пример внедрения зависимости через конструктор

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.IO;
 
namespace CyberForum
{
    public interface ILogger
    {
        public void WriteMessage(string message);
    }
    
    public class TextLogger : ILogger
    {
        private readonly TextWriter InnerWriter;
        
        public TextLogger(TextWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer), "Writer can't be null.");
            }
            
            InnerWriter = writer;
        }
        
        public void WriteMessage(string message)
        {
            // можете дополнить логику записи сообщения в лог как Вам угодно
            InnerWriter.WriteLine(message);
        }
    }
    
    public class ConsoleTextLogger : TextLogger
    {
        public ConsoleTextLogger() : base(Console.Out) {}
    }
    
    // конструктор класса SomeClass явно устанавливает зависимость от ILogger
    // при этом классу SomeClass абсолютно неважно, как будет реализован логгер -
    // главное, чтобы он корректно реализовывал интерфейс ILogger и не был равен null
    public class SomeClass
    {
        private readonly ILogger Logger;
        
        public SomeClass(ILogger logger)
        {
            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger), "Logger can't be null.");
            }
            
            Logger = logger;
        }
        
        public void DoSomething()
        {
            // bla bla bla bla
            
            Logger.WriteMessage("DoSomething completed successfully!");
        }
    }
    
    public class Program
    {
        // точка входа для приложения
        public static void Main(string[] args)
        {
            ILogger logger = new ConsoleTextLogger(); // ОДИН раз создали логгер 
            
            // создаём и инициализируем массив из 10 экземпляров SomeClass
            SomeClass[] instances = new SomeClass[10];
            for (int index = 0; index < instances.Length; ++index)
            {
                // зависимость ILogger явно передаётся через конструктор при создании экземпляра SomeClass
                instances[index] = new SomeClass(logger);
            }
            
            // вызываем метод DoSomething для каждого экземпляра SomeClass (а логгер по-прежнему один!)
            Array.ForEach(instances, inst => inst.DoSomething());
        }
    }
}
1
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
06.01.2017, 03:20
Цитата Сообщение от dav1977 Посмотреть сообщение
если есть 2 класса и у них есть статический общий класс, в котором храняться данные 2х этих классов,
смысл тогда этих 2х классов? Инкапсуля́ция где? Где целостность данных их бесопастность, делайте тогда один класс да и все.
Причем тут данные и инкапсуляция в данном примере?? Я вам еще раз повторяю, вы делаете жуткий костыль. Вы ничем не нарушаете инкапсуляцию имея статическую функцию которая пишет в лог, вы и не должны в этом статическом классе держать какую либо информацию, просто функцию, которая только пишет в файл.

И я вам еще раз повторю что возможности языка используются в зависимости от текущей задачи, а лепить непонятный велосипед из-за того что какой-то идиот написал (а вы прочитали), что статика это совсем плохо в любых ее проявлениях (а то у вас прям фобия на статику) - это не значит, что это правда
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
06.01.2017, 08:13  [ТС]
Цитата Сообщение от lvlkoo Посмотреть сообщение
Причем тут данные и инкапсуляция в данном примере?
в том что я могу повредить из класса чужие данные(данные другого класса)

я раньше все делал на статике это очень просто, сейчас хочу повысить уровень
вот пожалуйста красивое решение предложил bax_tang и никакой статики.
bax_tang СПАСИБО!
0
22 / 20 / 3
Регистрация: 12.10.2016
Сообщений: 62
06.01.2017, 09:33
dav1977, решение хорошее. Оно классическое и используется повсеместно для логирования. Может Вам стоит почитать про SOLID. Скорее всего, подобные вопросы отпадут сами собой. Например вот. Вам однозначно стоит ознакомиться
1
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
06.01.2017, 10:11  [ТС]
чтобы начать изучать SOLID надо хотя бы с event и интерфесами разобраться, изучать еще много надо,
согласен
0
22 / 20 / 3
Регистрация: 12.10.2016
Сообщений: 62
06.01.2017, 10:43
dav1977, но только надо разобраться в том, что это такое, а не пытаться решать задачи. Ничего хорошего не получится, либо получится, но затраты времени на хождение по граблям для достижения приемлемого результат во много раз превысят затраты времени на прочтение хорошей книги. Я эту книгу прочёл практически в самом начале пути. Да, с первого прочтения не всё уложилось. Но надо читать ещё раз
0
2 / 2 / 3
Регистрация: 13.12.2015
Сообщений: 49
06.01.2017, 10:50  [ТС]
Абсолютно согласен, поэтому я и не могу понять зачем events нужны, как их применять. Нужна база ООП. Спасибо за советы и за книжку буду покупать.
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
06.01.2017, 12:06
Цитата Сообщение от dav1977 Посмотреть сообщение
в том что я могу повредить из класса чужие данные(данные другого класса)
О господи, вам не реально что-то обьяснить, вы не желаете вникать в текст. Нервов больше не хватает, делайте как хотите, когданибудь через годика 3 до вас дойдет то что вам пытались донести.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2017, 12:06

Random между классами
Пожалуйста, можете накинуть идею, как реализовать данную задачу. Существует 6 классов, которые наследуются от 1 класса. И мне нужно сделать...

Обмен данными между классами
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Передача данных между классами
Как перевести a.ToString() или же fff из public void getdata в void Fillcombo() для последующей обработки? public void...

Передача строк между классами
Здравствуйте. Возникла проблема в формировании логов. Имеется приложение, с кучей форм, классов. Необходимо при возникновении в каждом...

Ссылка на обьект между классами
Есть два класса class CLASS1 { MySqlConnection myConnection = new MySqlConnection(Connect); } class Class2 {


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru