1 回答
TA贡献1852条经验 获得超7个赞
由于方法是virtual,将调用正确的版本。起作用的机制称为多态性。
事实上CreateDocument,甚至不需要是虚拟的就可以工作(除非你打算在另一个基类中覆盖它)。
您可以在一个简单的测试程序中看到它(请注意,我编写的程序CreatePage protected不能从外部DocumentWriter或其基类调用)。请注意,即使我CreateDocument通过基类类型显式调用,它也将始终根据对象的运行时类型调用正确的版本。
public class DocumentWriter
{
public /*virtual*/ void CreateDocument()
{
CreatePage();
}
protected virtual void CreatePage()
{
System.Console.WriteLine("DocumentWriter.CreatePage()");
}
}
public class PdfDocumentWriter : DocumentWriter
{
protected override void CreatePage()
{
System.Console.WriteLine("PdfDocumentWriter.CreatePage()");
}
}
public class HtmlDocumentWriter : DocumentWriter
{
protected override void CreatePage()
{
System.Console.WriteLine("HtmlDocumentWriter.CreatePage()");
}
}
public static class Program
{
public static void Main()
{
DocumentWriter documentWriter = new PdfDocumentWriter();
documentWriter.CreateDocument();
// Re-use the same variable.
// CreateDocumentwill still call the correct version of CreatePage.
documentWriter = new HtmlDocumentWriter();
documentWriter.CreateDocument();
}
}
这打印
PdfDocumentWriter.CreatePage()
HtmlDocumentWriter.CreatePage()
正如预期的那样。
- 1 回答
- 0 关注
- 160 浏览
添加回答
举报