第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從基調(diào)用虛擬方法

從基調(diào)用虛擬方法

C#
三國紛爭 2021-08-22 17:20:46
我正在嘗試基于此示例為 MigraDoc 創(chuàng)建一個庫,該庫支持不同類型的文檔。我的想法是創(chuàng)建一個基類,并帶有一個虛方法CreatePage()(負(fù)責(zé)頁面布局的方法)。但是,概念是CreatePage()應(yīng)該從CreateDocument()用戶調(diào)用的方法調(diào)用。唉,可以覆蓋CreatePage(),但它并不意味著直接調(diào)用。它看起來像這樣:public class DocumentWriter{    private Document document;    public virtual void CreateDocument(IDocumentArgs args)    {       document = new Document();       DefineStyles();       CreatePage();       FillContent(args);    }    public virtual void CreatePage()    {        // Create page layout here    }    // Remaining code skipped for readability...}但是如果創(chuàng)建繼承的類,它會覆蓋CreatePage(),那么將從中調(diào)用哪個方法CreateDocument()?原始虛擬(非覆蓋)方法覆蓋的方法 CreatePage()
查看完整描述

1 回答

?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗 獲得超7個贊

由于方法是virtual,將調(diào)用正確的版本。起作用的機(jī)制稱為多態(tài)性。


事實上CreateDocument,甚至不需要是虛擬的就可以工作(除非你打算在另一個基類中覆蓋它)。


您可以在一個簡單的測試程序中看到它(請注意,我編寫的程序CreatePage protected不能從外部DocumentWriter或其基類調(diào)用)。請注意,即使我CreateDocument通過基類類型顯式調(diào)用,它也將始終根據(jù)對象的運(yùn)行時類型調(diào)用正確的版本。


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()

正如預(yù)期的那樣。


查看完整回答
反對 回復(fù) 2021-08-22
  • 1 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號