随笔 - 31  文章 - 2 评论 - 26 阅读 - 46638
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

在对C#类的继承中,经常要用到overrid和new来满足新类自己的方法,C#提供了overrid来重写基类的方法,这样,新继承的类就有和基类相同的函数索引,但却有自己的实现方式,这样在新类实例中调用该方法,也就只调用自己重新写过的方法了。使用方法只要在该函数名前加上overrid就行了。
         而使用new方法却和overrid有点不一样,new关键字可以显式隐藏从基类继承的成员,隐藏继承的成员意味着该成员的派生版本将替换基类版本,这里我个人理解是:它只是一种蕴藏,派生类从基类继承过来的其他方法调用关系中,仍然是在调用该方法,而不会调用用户使用new关键字新生成的方法,也就是基类的该旧方法还是存在的,而派生类又新增加了自己的一个类似方法。比如,在windows form 编程时,使用的OnResize方法,如果像下面这样写:

1protected override void OnResize(EventArgs e)
2        {
3            Invalidate();
5        }

该函数中的Invalidate();提示应用程序,窗体需要刷新。每次拉动窗体使其变大或缩小时,都会刷新窗体,这是应为我重写了Form类中的OnResize方法,这样Form窗体大小发生变化时就会调用我重写过的函数,而不是基类的OnResize。
如果使用new方法,如下:

        protected new void OnResize(EventArgs e)
        
{
            Invalidate();

        }
你会发现,当你拉动窗体,使其发生大小改变时,窗体并不会刷新,这是应为窗体调用的是基类继承下来的OnResize,而不是调用上面用new关键字生成的新的OnResize,这就是new和overrid的区别所在。

如果你在做本实验时看不出效果,建议可以添加一个overrid过的OnPaint函数
        protected override void OnPaint(PaintEventArgs e)
        
{
            
string str = "Form  Control Information: \nLocation:" + Location + "\n"
                
+ "Size: " + Size + "\n"
                
+ "Bounds: " + Bounds + "\n"
                
+ "Width: " + Width + "\n"
                
+ "Height: " + Height + "\n"
                
+ "Left: " + Left + "\n"

                
+ "Top: " + Top + "\n"
                
+ "Right: " + Right + "\n"
                
+ "Bottom: " + Bottom + "\n"
                
+ "DesktopLocation: " + DesktopLocation + "\n"
                
+ "DesktopBounds: " + DesktopBounds + "\n"
                
+ "ClientSize: " + ClientSize + "\n"
                
+ "ClientRectangle: " + ClientRectangle + "\n";
            e.Graphics.DrawString(str, Font, Brushes.Black, 
0100);
}
该代码是本人在学习Wndows From编程是从《Programming Microsoft Windows with C#》这本书上摘下来的。
posted on   烂人  阅读(1367)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示