Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

[Homework] OOP - Delegates and Events - Problem {3) Student Class - как да засечем промяна в класа?

Гледах лекцията на Наков за евентите и разбрах много малко. Обяснението му беше "Евентите правят това и това, няма да ви обяснявам как се пишат..." И в домашното да напишем евенти. То хубаво самообучение ама...
Както и да е, гледам в момента един линк от презентацията:
http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

И проблемът е, че разбирам много малко. Основният ми проблем е, че не схващам къде точно програмата разбира, че има промяна в пропъртито на класа? Как го хендълва горе-долу схванах. Да караме по ред проблемните части от кода:

public delegate void ChangedEventHandler(object sender, EventArgs e); - тук декларираме делегат. Макар че тези (object sender, EventArgs e) така и не мога да ги разбера какво представляват и как се ползват.
public event ChangedEventHandler Changed; - тук присвояваме делегата към евента Changed.

protected virtual void OnChanged(EventArgs e) 
      {
         if (Changed != null)
            Changed(this, e);
      } - Това си нямам и идея какво е. Нито какво прави. 

Виждам, че го викаме по-надолу при определени обстоятелства:
public override int Add(object value) 
      {
         int i = base.Add(value);
         OnChanged(EventArgs.Empty); - явно това променя по някакъв начин стойността на EventArgs (каквото и да е това) и вика метода
         return i;
      }

Та не мога да разбера - как да накарам класа да зацепи, че има промени в пропъртитата и да извикам хендлъра? Като цяло смятам, че темата не е обяснена достатъчно добре и ясно. А дори не знам какво да търся в нета. Информацията е на прекалено високо ниво, за да я разбера.

Тагове:
-4
C# OOP Basics
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Как променяме вътрешното състояние (private fields) на класа? - Чрез пропъртита.

В тези пропъртита можеш да слагаш всякаква логика. Просто в set-ъра извикваш event-a.

Класа зацепва, че има промени в пропъртитата, когато кода, дефиниран в set {}, започва изпълнение.

Като дефинираш event в даден клас, ти всъщност дефинираш публичен масив, който държи методи. Някой отвън като добави метод в този event/масив, те се запазват вътре. В класа, който държи event-a, можеш спокойно да извикаш този event като обикновена функция, което ще накара да се изпълнят всички методи в него, които са дефинирани отвън, даже в същата последователност, в която са добавени.

PS: След малко ще ти напиша код с коментари, освен ако вече не си схванал идеята! :)

1
10/01/2015 15:37:19
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Благодаря за кода, помогна ми. Само не мога да разбера какво е това наследяване на EventArgs от PropertyChanged. Знам какво е унаследяване, но не му разбирам идеята в случая.

0
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Така е прието и така се прави! Клас, който служи като контейнър на event data, наследява класа EventArgs и името му завършва на EventArgs. Мисля, че ще работи и без да го наследиш, но ще си против конвенцията на M$.

"To create a custom event data class, create a class that derives from the EventArgs class and provide the properties to store the necessary data. The name of your custom event data class should end with EventArgs."

0
velio84 avatar velio84 241 Точки

Благодаря за решението ти. Аз скалъпих работещо решение, но не е по конвенцията на MS - конвенцията им ми беше малко мътна, но като ти видях примера горе долу схванах какво се прави :)

Ето го моя Франкенщайн:

Student

Main

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Скалъпих нещи, което горе-долу работи:
https://github.com/HPenchev/SoftUni-Projects/tree/master/Object-Oriented%20Programming/Projects/DelegatesAndEvents/Problem03_StudentClass

Само че има неща, които не ми е ясно за какво са. 
protected virtual void OnChanged(EventArgs e)
OnChanged(EventArgs.Empty) - това не мога да разера какво прави, просто го видях в туториал на Майкрософт.

 

Друго, което не мога да разбера:

private void ChangedProperty(object sender, EventArgs e)
{
Console.WriteLine("Property changed: {0} (from {1} to {2}");

}

 

Евент хендлъра ми вика този метод. Само че как да разбера дали се е сменило името или възрастта? някъде из (object sender, EventArgs e)? Дори не знам как се борави с тях.

Мерси предварително.

0
vladislav_hadzhiyski avatar vladislav_hadzhiyski 66 Точки

Ето един по- интересен начин за решение на задачата.

class Program
{
    static void Test()
    {
        dynamic employee = new ExpandoObject();
        ((INotifyPropertyChanged)employee).PropertyChanged +=
            new PropertyChangedEventHandler(HandlePropertyChanges);
        employee.Name = "John Smith";
    }

    private static void HandlePropertyChanges(
        object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine("{0} has changed.", e.PropertyName);
    }
}
Source: MSDN
0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.