基类是否可能在调用派生类中的方法时得到通知?

本文关键字:方法 通知 是否 派生 调用 基类 | 更新日期: 2023-09-27 18:15:43

考虑以下小设计:

public class Parent
{
  public event EventHandler ParentWentOut;
  public virtual void GoToWork()
  {
     ParentWentOut();
  }
}
public class Mother : Parent
{
   public override void GoToWork()
   {
     // Do some stuff here
     base.GoToWork(); // <- I don't want to write this in any derived class. 
                      //    I want base class's method to be automatically called.
   }
}

是否有任何机制使Parent.GoToWork方法隐式地自动调用,当这个方法在后代(这里是Mother类)的重写版本中完成时?

基类是否可能在调用派生类中的方法时得到通知?

你可以尝试这样做

public class Parent
{
   public event EventHandler ParentWentOut;
   public void GoToWork()
   {
     BeforeParentWentOut();
     ParentWentOut();
     AfterParentWentOut();         
   }
   protected virtual void BeforeParentWentOut()
   {
      // Dont do anything, you can even make it abstract if it suits you
   }
   protected virtual void AfterParentWentOut()
   {
      // Dont do anything, you can even make it abstract if it suits you
   }
}

public class Mother : Parent
{
   protected override void BeforeParentWentOut()
   {
      // Do some stuff here
   }
}

还可以在Mother类上订阅自己的事件并对其作出反应。

因此,到目前为止访问基类的唯一方法是通过base关键字,该关键字以某种方式保存对基类的引用,该基类通过调用其构造函数初始化。

所以你的答案是否定的

我建议使用两个方法——一个用于公共API,另一个用于方法的内部功能。

public class Parent
{
  public event EventHandler ParentWentOut;
  public void GoToWork()
  {
     GoToWorkOverride();
     ParentWentOut();
  }
  protected virtual void GoToWorkOverride()
  {}
}
public class Mother : Parent
{
   protected override void GoToWorkOverride()
   {
       // Do some stuff here
   }
}