new和override修饰符的区别

简介: 前几日回复了一个网友的帖子,是关于new和override修饰符的区别,初看时发现自己也甚为模糊,msdn上的描述甚至也不能令人完全明确其区别,但于使用上并无大碍。简单的描述:        virtual:虚方法。

        前几日回复了一个网友的帖子,是关于new和override修饰符的区别,初看时发现自己也甚为模糊,msdn上的描述甚至也不能令人完全明确其区别,但于使用上并无大碍。简单的描述:
       virtual:虚方法。可从父类继承也可以子类实现自己的个性,也就是OO三大特性中的多态。调用那个函数属于运行时决定。
       new:隐藏了父类的virtual方法,默认调用自身实现的方法,但是可以显示的指定调用父类方法。函数同名时的默认行为。
       override:覆盖了父类的方法,只能调用自身的方法。
       abstract:抽象方法(或者类),即本身不包含实现,非抽象子类必须override它。可以指定一个方法为abstract来强制子类去实现它。
       overload:通过参数列表来确定调用同名方法而已,这个应该编译时就能确定的了。

Code
Code
public class BaseClass
{
    
public virtual void Func1()
    {
        Console.WriteLine(
"  Base.F1");
    }
}

public class ChildClass1 : BaseClass
{
    
public override void Func1()
    {
        Console.WriteLine(
"  (overrided) C1.myF1");     
    }
}

public class ChildClass2 : BaseClass
{
    
public new void Func1()
    {
        Console.WriteLine(
"  (new) C2.newF1");
    }
}
static void Main(string[] args)
{
    BaseClass  ba_c1 
= new ChildClass1();
    BaseClass  ba_c2 
= new ChildClass2();
    ChildClass1 c1_c1 
= (ChildClass1)ba_c1;
    ChildClass2 c2_c2 
= (ChildClass2)ba_c2;
    
// override 
    Console.Write("ba_c1:");
    ba_c1.Func1();
    Console.Write(
"c1_c1:");
    c1_c1.Func1();
    
// new
    Console.Write("ba_c2:");
    ba_c2.Func1();
    Console.Write(
"c2_c2:");
    c2_c2.Func1();
}

例如以上代码,override时,只能输出自身方法,而new时,可以使用父类类型调用其父方法。上面代码的结果为:
---------------------------------------------------------------
    ba_c1:  (overrided) C1.myF1     //override:  父类方法已被重写
    c1_c1:  (overrided) C1.myF1
    ba_c2:  Base.F1                         //new:  可以显示调用父类方法
    c2_c2:  (new) C2.newF1
--------------------------------------------------------------------------

例如一个矢量图形显示模块中,定义了各种类型的MapObject,即数据是用MapObjectCollection来组织的,这是调用集合中每个元素的Draw方法时,则每个元素应该override父类的draw方法才能实现正确的绘制。
------------------------------
另一则,关于接口,Interface,曾经有位同事为我接口在哪(在内存中占据何处),接口只是一种规约,协议(编译器可以理解它),怎么可能有实例呢?所以接口也不可能有构造函数,如果有那就是具体对象和具体类了。它好比规定一些对象应该具有那些属性,哪些行为,而协议何来数据,没有数据又怎么可能在内存中占据位置呢?指定了接口来声明一个对象,相当于就可以确定你想调用这个对象的哪一个方法或者成员变量。曾经很久以前看过一篇“我是谁”的关于接口的帖子,还引用了成龙的电影也是令人很.....,一个对象是什么取决于你用那个类的构造函数构造了它,和你用什么类型的声明或者什么类型的指针并没有关系。例如句柄也是指针,它指向的实际的结构,但操作系统为了封装数据,把它强转为了指向一个空结构的指针。一个对象和它的父类的关系是“is a”。和接口的关系是“满足”或者“符合”,你可以指针类型转换为别的类型,但是它是什么取决于new 后面的那个构造函数。
目录
相关文章
|
设计模式 前端开发 API
【设计模式】之工厂模式
工厂模式是一种常用的创建对象的设计模式,它通过封装对象的创建逻辑,提供统一的接口,实现了代码的解耦和可扩展性。在实际开发中,可以根据具体需求选择是否使用工厂模式来创建对象。工厂模式可以应用于任何需要创建对象的场景。通过使用工厂模式,我们可以提高代码的可维护性、可扩展性和可测试性,使得代码更加灵活和易于理解。
157 0
|
SQL 存储 缓存
MySQL组成
MySQL组成
|
人机交互 数据库 数据中心
章六 软件体系结构的研究与展望
章六 软件体系结构的研究与展望 计算机的软件领域主要研究计算机使用的环境技术,包括系统软件、用户编程环境与工具、应用软件等。 计算机硬件能够快速发展的原因之一是工业化程度比较好,很多集成电路按照功能做成标准器件,因而好的功能块会保留下来并不断改进。
1004 0
|
3天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
1天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。
|
2天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
5天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
555 2
|
3天前
|
Linux 虚拟化 iOS开发
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
793 4
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件