Мой способ может быть неправильным, но полезным
Преобразовать как float в строки, так и выполнить сравнение строк
bool IsFlaotEqual(float a, float b, int decimal)
{
TCHAR form[50] = _T("");
_stprintf(form, _T("%%.%df"), decimal);
TCHAR a1[30] = _T(""), a2[30] = _T("");
_stprintf(a1, form, a);
_stprintf(a2, form, b);
if( _tcscmp(a1, a2) == 0 )
return true;
return false;
}
оператор-переаполяция также
Что вам нужно сделать, это:
В вашем базовом классе (где вы объявили события) создайте защищенные методы, которые можно использовать для повышения событий:
public class MyClass
{
public event EventHandler Loading;
public event EventHandler Finished;
protected virtual void OnLoading(EventArgs e)
{
EventHandler handler = Loading;
if( handler != null )
{
handler(this, e);
}
}
protected virtual void OnFinished(EventArgs e)
{
EventHandler handler = Finished;
if( handler != null )
{
handler(this, e);
}
}
}
(Обратите внимание, что вам, вероятно, следует изменить эти методы, чтобы проверить, нужно ли вам вызывать обработчик событий или нет).
Затем в классах, которые наследуются от этого базового класса, вы можете просто вызовите методы OnFinished или OnLoading, чтобы поднять события:
public AnotherClass : MyClass
{
public void DoSomeStuff()
{
...
OnLoading(EventArgs.Empty);
...
OnFinished(EventArgs.Empty);
}
}
Вы можете получить доступ только к событию в объявляющем классе, поскольку .NET создает частные переменные экземпляра за кулисами, которые фактически удерживают делегата. Выполнение этого.
public event EventHandler MyPropertyChanged;
на самом деле делает это:
private EventHandler myPropertyChangedDelegate;
public event EventHandler MyPropertyChanged
{
add { myPropertyChangedDelegate += value; }
remove { myPropertyChangedDelegate -= value; }
}
и делает это ...
MyPropertyChanged(this, EventArgs.Empty);
на самом деле это .. .
myPropertyChangedDelegate(this, EventArgs.Empty);
Таким образом, вы можете (очевидно) получить доступ только к переменной экземпляра частного делегата из класса объявления.
Соглашение должно предоставить что-то подобное в объявляющем классе. .
protected virtual void OnMyPropertyChanged(EventArgs e)
{
EventHandler invoker = MyPropertyChanged;
if(invoker != null) invoker(this, e);
}
Вы можете вызвать OnMyPropertyChanged(EventArgs.Empty)
из любого места этого класса или ниже иерархии наследования для вызова события.
Я предполагаю, что я не могу получить доступ к этим событиям так же, как другие унаследованные элементы?
blockquote>Точно. Для каждого события в базовом классе принято предоставлять защищенную функцию
OnXyz
илиRaiseXyz
, чтобы включить повышение из унаследованных классов. Например:public event EventHandler Loading; protected virtual void OnLoading() { EventHandler handler = Loading; if (handler != null) handler(this, EventArgs.Empty); }
Вызывается в унаследованном классе:
OnLoading();
Вы можете попробовать так, это работает для меня:
public delegate void MyEventHaldler(object sender, EventArgs e);
public class B
{
public virtual event MyEventHaldler MyEvent;
protected override void OnChanged(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
}
public class D : B
{
public override event MyEventHaldler MyEvent;
protected override void OnChanged(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
}