C#虚拟函数



我在下面的课上有一个问题。

Photo类继承自Form并具有映像,因此当我根据其构造函数创建Photo类的对象时,它会因为虚拟Drawer方法而绘制映像。

有继承自Photo类的BorderedPhoto类,也有设置照片图像周围边界的覆盖方法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类对象来创建BorderdPhoto类的对象时,为什么它被称为Bordered类事件的override Drawer(),尽管它没有明确地调用它。

所以我认为这意味着。。。

Photo p = new BorderedPhoto();

这就是多态性的全部意义。如果在调用多态方法时必须限定底层类型,那有什么意义呢?这种行为允许您通过共享接口处理不同的实现。

此外,由于在重写内部调用base.Drawer(source, e);,因此也将调用基类实现。

相关内容

  • 没有找到相关文章

最新更新