接口回调

//声明接口

public interface ICallBack
{
  void Show();
}

//类Student实现接口方法

public class Student: ICallBack

{
  public void Show()
  {
    HttpContext.Current.Response.Write(string.Format("Hi,I'm a {0}!<br/>", "Student"));
  }
}

//类Teacher实现接口方法

public class Teacher: ICallBack
{
  public void Show()
  {
    HttpContext.Current.Response.Write(string.Format("Hi,I'm a {0}!<br/>", "Teacher"));
  }
}

类Student、类Teacher均实现了共同的接口ICallBack,但是他们实现的方法内部各有不同。现在设想一下:在某段事务处理中需要用到接口ICallBack提供的功能(在本例中只有一个方法Show),可是又无法确定具体是需要哪个子类实现的Show方法,那么可以直接在事务中声明接口ICallBack的句柄,不用实例化。等到事务运行的时候再自动确定。看下面这段代码:

public class ICallBackMethod
{
  public void ICallBacks(ICallBack cb)
  {
    cb.Show();
  }
}

在入口进行实例化:

protected void Page_Load(object sender, EventArgs e)
{

  ICallBack sBack = new Student();//里氏替换原则(LSP):父类/接口指向子类的实例

  ICallBack tBack = new Teacher();

  ICallBackMethod iBack = new ICallBackMethod();
  iBack.ICallBacks(sBack);

}

页面显示:Hi,I'm a Student!

在本例中,类Student继承了接口ICallBack,并且实现了接口方法Show。我们在入口实例化类ICallBackMethod,并将句柄的实例传给方法ICallBacks,这时接口句柄其实是指向类Student对象的引用,因此在方法ICallBackMethod.ICallBacks中句柄调用Show方法时,其指向Student.Show方法。这很好的解决了具体实现与事务处理的解耦。在类ICallBackMethod处理事务过程中不需要知道实现接口的子类也可以方便的扩充和维护代码,即设计模式的开闭原则(OCP:对扩展开放,对修改关闭)。上面的代码中,sBack、tBack都可以称为接口回调对象,它们虽然被声明为接口ICallBack类型,但是在实例化时却是已实现的某个子类。

由于个人认知能力有限,请大家批评指正。

原文地址:https://www.cnblogs.com/jack-Leo/p/6215116.html