使用接口的多态性
本文关键字:多态性 接口 | 更新日期: 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();
}
}
- 这个设计有多好,类派生自基类以及接口,只实现所需的功能 - 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
这样,我们保留了接口的合约,提供了将始终被调用的样板代码,并允许其他类更改行为。 在大多数情况下,我倾向于使用抽象的受保护函数实现上述内容。 我也不必记得调用基类实现,或者以什么顺序(我的覆盖的开始或结束?