c# – 覆盖方法与分配方法在OOP中的代理/事件

前端之家收集整理的这篇文章主要介绍了c# – 覆盖方法与分配方法在OOP中的代理/事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个奇怪的问题.我想创建一组对象(在设计时已知),每个对象都具有与它们相关联的某些功能.
我可以通过给我可以包含“委托”的对象属性来实现:
  1. public class StateTransition {
  2. Func<bool> Condition { get; set; }
  3. Action ActionToTake { get; set; }
  4. Func<bool> VerifyActionWorked { get; set; }
  5. }
  6.  
  7. StateTransition foo = new StateTransition {
  8. Condition = () => {//...}
  9. // etc
  10. };

或者,我可以使用抽象类,并为每个要创建的对象实现这一点:

  1. public abstract class StateTransition {
  2. public abstract bool Condition();
  3. public abstract void ActionToTake();
  4. public abstract bool VerifyActionWorked();
  5. }
  6.  
  7. class Foo : StateTransition {
  8. public override bool Condition() {//...}
  9. // etc
  10. }
  11.  
  12. Foo f = new Foo();

我意识到这两种方法的实际后果(在设计时创造与运行时间)是完全不同的.

如何选择适合我的应用程序的方法

解决方法

第一种方法看起来比原始代表更适合于事件,但…无论如何.

他们之间的关键因素是:谁控制发生什么?

如果来电者可以合法地做任何事情,那么事件的做法就可以了.该系统不会强制您只是为了添加按钮,以便添加当您单击它时会发生什么,毕竟(尽管可以这样做).

如果“可能发生的事情”得到很好的控制,并且你不希望每个呼叫者都做不同的事情,那么一个子类的方法就更适合了.这也避免了每个呼叫者必须告诉它做什么,当“要做的事情”实际上可能是很少的选项.基本类型的方法还提供了控制子类的能力,例如通过在基类上只有一个内部构造器(因此只有在同一个程序集中的类型或通过[InternalsVisibleTo(…),可以子类化).

您也可以通过以下方式组合两个(覆盖vs事件)

  1. public class StateTransition {
  2. public event Func<bool> Condition;
  3. protected virtual bool OnCondition() {
  4. var handler = Condition;
  5. return handler == null ? false : handler();
  6. }
  7. public event Action ActionToTake;
  8. protected virtual void OnActionToTake() {
  9. var handler = ActionToTake;
  10. if(handler != null) handler();
  11. }
  12. public event Func<bool> VerifyActionWorked;
  13. protected virtual bool OnVerifyActionWorked() {
  14. var handler = VerifyActionWorked;
  15. return handler == null ? true : handler();
  16. }
  17. // TODO: think about default return values
  18. }

委托/事件处理方法另外需要考虑的是:如果代理为空,你该怎么办?如果你需要所有3,那么在构造函数中要求所有3都是一个好主意.

猜你在找的C#相关文章