调用方法后调用事件
Call event after method is called
我实际上遇到了一个奇怪的问题。我尝试基于 Hashset class.
创建一个新的 Set class
public delegate void ChangedEventHandler();
class Set<T> : HashSet<T>
{
event ChangedEventHandler Added;
public bool Add(T item)
{
bool answer = base.Add(item);
Added?(); //or Added?.Invoke()
return answer;
}
}
并且我希望在调用 Add 方法后执行一些函数。嗯,上面的代码说 Add 已经在基 class 中实现,但它不是虚拟的。我无法覆盖它。
其实我想得到这样的结果:
Set<int> numbers = new Set<int>();
numbers.Added += SumNumbers;
numbers.Added += PrintNumbers;
numbers.Add(2) //Outputs 2
numbers.Add(4) //Outputs 6
//somewhere in this class
public int SumNumbers() {...}
public void PrintNumbers() {...}
坦率地说,我不需要函数具有不同的语法结构,但如果它们是,那么还有一个问题该怎么办。
这是我通常使用的模式:
public class Set<T> : HashSet<T>
{
private event ChangedEventHandler Added;
public new bool Add(T item)
{
bool answer = base.Add(item);
OnAdded();
return answer;
}
private void OnAdded()
{
if (Added == null)
return;
Added();
}
}
只需为方法定义添加 "new" 关键字,因为编译器会警告您,您正在隐藏基本实现:
public new bool Add(T item)
{
bool answer = base.Add(item);
if(Added != null)
{
Added();
}
return answer;
}
将处理程序附加到事件的正确语法也没有“()”(您传递的是方法,而不是调用):
numbers.Added += SumNumbers;
numbers.Added += PrintNumbers;
//somewhere in this class
public int SumNumbers() {...}
public void PrintNumbers() {...}
如果它不是 virtual
并且您仍然想要该方法的新实现,请向该方法添加一个 "new"
运算符以隐藏基础 class 实现,如下所示
public new bool Add(T item)
我实际上遇到了一个奇怪的问题。我尝试基于 Hashset class.
创建一个新的 Set classpublic delegate void ChangedEventHandler();
class Set<T> : HashSet<T>
{
event ChangedEventHandler Added;
public bool Add(T item)
{
bool answer = base.Add(item);
Added?(); //or Added?.Invoke()
return answer;
}
}
并且我希望在调用 Add 方法后执行一些函数。嗯,上面的代码说 Add 已经在基 class 中实现,但它不是虚拟的。我无法覆盖它。
其实我想得到这样的结果:
Set<int> numbers = new Set<int>();
numbers.Added += SumNumbers;
numbers.Added += PrintNumbers;
numbers.Add(2) //Outputs 2
numbers.Add(4) //Outputs 6
//somewhere in this class
public int SumNumbers() {...}
public void PrintNumbers() {...}
坦率地说,我不需要函数具有不同的语法结构,但如果它们是,那么还有一个问题该怎么办。
这是我通常使用的模式:
public class Set<T> : HashSet<T>
{
private event ChangedEventHandler Added;
public new bool Add(T item)
{
bool answer = base.Add(item);
OnAdded();
return answer;
}
private void OnAdded()
{
if (Added == null)
return;
Added();
}
}
只需为方法定义添加 "new" 关键字,因为编译器会警告您,您正在隐藏基本实现:
public new bool Add(T item)
{
bool answer = base.Add(item);
if(Added != null)
{
Added();
}
return answer;
}
将处理程序附加到事件的正确语法也没有“()”(您传递的是方法,而不是调用):
numbers.Added += SumNumbers;
numbers.Added += PrintNumbers;
//somewhere in this class
public int SumNumbers() {...}
public void PrintNumbers() {...}
如果它不是 virtual
并且您仍然想要该方法的新实现,请向该方法添加一个 "new"
运算符以隐藏基础 class 实现,如下所示
public new bool Add(T item)