0

我有一个关于下课的问题。

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

有一个BorderedPhoto类继承自Photo类,还有一个覆盖方法Drawer(),可以设置照片图像周围的边框。

该程序运行良好,但我的困惑是当我BorderedPhoto通过引用 Photo 类对象创建类对象时,为什么它被称为Drawer()Bordered 类的覆盖,即使它没有显式调用它。

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);
    }
}
4

1 回答 1

2

该程序运行良好,但我的困惑是当我通过引用 Photo 类对象创建 BorderedPhoto 类的对象时,为什么它被称为 Bordered 类的 override Drawer() ,尽管它没有明确调用它。

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

Photo p = new BorderedPhoto();

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

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

于 2012-08-19T19:17:38.780 回答