使用接口的多态性

本文关键字:多态性 接口 | 更新日期: 2023-09-27 17:56:19

从接口 IPrintHandler 派生的类 BasePrintHandler 并实现所需的功能。这是作为库提供的

应用程序必须提供与库不同的功能(SendToPrint)。为此,我从 BaseClass 和接口中派生了一个类。

为此,我创建了一个示例

interface IPrintHandler
{
    void SetPage();
    void SendToPrint();
}
class BasePrintHandler : IPrintHandler
{
    void IPrintHandler.SendToPrint()
    {
        Console.WriteLine("in the base print handler");
    }
    void IPrintHandler.SetPage()
    {
        Console.WriteLine("in the setpage");
    }
}
class ChildPrintHandler : BasePrintHandler,IPrintHandler
{
    private BasePrintHandler m_Printhandler;
    public ChildPrintHandler()
    {
        m_Printhandler = new BasePrintHandler();
    }
    void IPrintHandler.SendToPrint()
    {
        Console.WriteLine("in the derive class");
        IPrintHandler aPRinthandler = m_Printhandler as IPrintHandler;
        aPRinthandler.SendToPrint();
    }
}

class Program
{
    static void Main(string[] args)
    {
        IPrintHandler aLayouthandler = new ChildPrintHandler();
        aLayouthandler.SendToPrint();
        aLayouthandler.SetPage();
        Console.Read();
    }
}
  1. 这个设计有多好,类派生自基类以及接口,只实现所需的功能 - SendToPrint。

使用接口的多态性

这还不错,但在这种模型中,我更喜欢稍微不同。 基类可能会实现一些默认行为(可以完全替换),或者它可能会实现一些最需要的行为,其中子类必须记住调用基类。 当我编写接口并提供基类来提供样板实现时,我会在受保护的覆盖方面更进一步:

public interface IPrinter
{
    void SetPage();
    void SendToPrint();
} // eo interface IPrinter

public class BasePrinter : IPrinter /* Could well be abstract */
{
     protected virtual void SetPageImpl() { }      /* Also could be abstract */
     protected virtual void SendToPrintImpl() { }  /* ........ditto .....    */

     // IPrinter implementation
     public void SetPage()
     {
         SetPageImpl();
         // can do other stuff here.  Will always be called!
     } // eo SetPage

     public void SendToPrint()
     {
         SendToPrintImpl();
         // ditto
     }
}  // eo class BasePrinter

public class ChildPrinter : BasePrinter
{
     // we only do something different when setting a page
     protected override void SetPageImpl()
     {
        // ChildPrinter-specifics
     } // eo SetPageImpl
} // eo class ChildPrinter

这样,我们保留了接口的合约,提供了将始终被调用的样板代码,并允许其他类更改行为。 在大多数情况下,我倾向于使用抽象的受保护函数实现上述内容。 我也不必记得调用基类实现,或者以什么顺序(我的覆盖的开始或结束?