我在下面的课上有一个问题。
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);
,因此也将调用基类实现。