0

下のクラスについて質問です。

Photoクラスはから継承しForm、イメージを持っているため、コンストラクターに従ってクラスのオブジェクトを作成するとPhoto、仮想Drawerメソッドのためにイメージが描画されます。

BorderedPhotoクラスを継承するクラスがあり、写真画像の周りにボーダーを設定するPhotoオーバーライドメソッドもあります。Drawer()

プログラムは正常に実行されていますが、BorderedPhotoPhoto クラス オブジェクトを参照してクラスのオブジェクトを作成すると、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 クラスのオーバーライド Drawer() と呼ばれる理由が混乱します。

だから私はそれを次のような意味に取っています...

Photo p = new BorderedPhoto();

まあ、それがポリモーフィズムの要点です。ポリモーフィック メソッドを呼び出すときに基になる型を修飾する必要があるとしたら、そのポイントは何でしょうか? この動作により、共有インターフェイスを介してさまざまな実装を操作できます。

さらに、base.Drawer(source, e);オーバーライド内で呼び出すため、基本クラスの実装も呼び出されます。

于 2012-08-19T19:17:38.780 に答える