簡體   English   中英

C#虛函數

[英]C# Virtual Function

我對下面的課有疑問。

Photo類繼承自Form並且有一個圖像,因此當我按照構造函數創建Photo類的對象時,它會因為虛擬Drawer方法而繪制圖像。

BorderedPhoto類繼承自Photo類,並且還具有覆蓋方法Drawer() ,用於在照片圖像周圍設置邊框。

該程序運行正常,但我的困惑是當我通過提供Photo類對象創建BorderedPhoto類的對象,然后為什么它被稱為Bordered類的覆蓋Drawer() ,即使它沒有顯式調用它。

class Photo:Form
{
    Image image;
    public Photo()
    {
        image= new Bitmap(@"C:\Jug_7.jpg");

        this.Text = "My Water Jug";
        this.Paint+= new PaintEventHandler(Drawer);
    }
    public virtual void Drawer(object source, PaintEventArgs e)
    {
        e.Graphics.DrawImage(image, 20, 20);
    }
}
class BorderedPhoto : Photo
{
    Photo photo;
    Color color;
    public BorderedPhoto(Photo p, Color c)
    {
        photo = p;
        color = c;
    }
    public override void Drawer(object source, PaintEventArgs e)
    {
        base.Drawer(source, e);
        e.Graphics.DrawRectangle(new Pen(color, 10), 25, 15, 215, 225);
    }
}

該程序運行正常,但我的困惑是當我通過引用Photo類對象創建BorderedPhoto類的對象,然后為什么它被稱為覆蓋抽象類的抽象(),盡管它沒有顯式調用它。

所以我認為這意味着......

Photo p = new BorderedPhoto();

好吧,這就是多態性的全部意義。 如果在調用多態方法時必須限定基礎類型,那么重點是什么? 此行為允許您通過共享接口使用不同的實現。

此外,因為你調用base.Drawer(source, e); 在覆蓋內部,也將調用基類實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM