静态函数 抽象类 覆盖-重写-重载 委托-事件-匿名函数 密封 Lambda表达式

C#:重写基函数(override) 面向对象编程的三大特性是继承,封装和多态。当我们从父类中继承了一种方法,但是我们事实上需要的是另外一种方法,这时候我们就可以通过重写方法,实现一个方法名对应多种方法。    举例来说,我们有一个... 阅读详情

下面叙述以C#语言为例,其它语言也有参考价值

1、静态函数

   在类中定义静态函数,就不用实例化类了,直接用类名就可以访问了。在定义类的方法时,如果该方法与类的成员变量没有任何关系(也就是根本不会使用到类的成员变量),不对该类的成员变量进行读写,只是根据方法的参数进行操作,那么就应该将该方法声明为static方法,以节省资源(我自己不赞同)和提高执行速度(这点很关键)。比如常用的系统定义好的Math类中的方法一般都是静态的,因为它们都是对传入的参数进行操作然后返回一个运算结果,定义为静态的可以显著提高运行速度。Main方法也定义为静态的也是为了提高运行速度。静态的方法仅可以访问类中的静态变量不可以访问类中非静态的变量,但可以在方法内部临时定义变量并使用,也就是说static方法不可以访问方法外部定义好的变量(或对象),仅可以访问方法内部定义的变量或对象。

2、抽象类

  类中含有纯虚函数时,这个类就叫抽象类,抽象类不能实例化,子类只有实现了所有纯虚函数,才不是抽象类,就可以实例化了;抽象类就是为了表示抽象层次。

【C++中说带有纯虚函数的类称为抽象类,这里的纯虚函数就在java(c#)中就称为抽象方法,就是指没有实现体的方法。】

3、覆盖,重写,重载

基础概念:

方法的签名”包括返回类型、方法名、参数列表,这三者共同标识了一个方法。
“声明方法”,即指出该方法的签名。“定义方法”,则是指定调用方法时执行的代码。
“同名方法”是指方法的签名相同的两个方法。
”重写”一个方法,意味着子类想继承父类对方法的声明,却想重新定义该方法。

“在C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。
C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。
C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。C#里,在一个类中声明一个方法时,有四个和方法的继承性有关的关键字:new、virtual、sealed、override。

 在基类中,实现函数fun(),在子类中再次实现fun(),那么就是覆盖,但方法的签名(返回值类型及参数列表)必须相同。

 在基类中,实现函数fun(),在子类中再次实现fun,但是参数不同,这就是重载,要求方法的签名必须不同。

 基类中,实现虚函数virtual fun(),在子类中重写override实现fun(),那么就是重写, 但方法的签名(返回值类型及参数列表)必须相同。

 在c++中并没有严格区分覆盖和重写(没有专门关键字),实际上一般人都笼统的认为覆盖就是重写,方法的签名都必须一样,只不过对于覆盖或重写的基础上在使用虚方法时就可以实现动态联编。

【重载是静态联编,含有虚函数的覆盖或重写是动态联编,而不用虚函数的覆盖或重写根本就不存在联编的概念,也就是说此时编译器根本就不存在区分多个相同函数名的情况。】

 

 覆盖或重载时,基类对象只能访问基类函数,不能访问到子类的函数,即使把子类对象转换到基类对象,基类对 象访问的还是基类函数; 若是重载,那子类对象还是能访问到从基类继承下来的函数,若是覆盖,那么子类只能访问到自己的函数

 重写时,前提是基类的函数是虚函数 virtual,而子类函数用关键字override重写。这样如果把子类对象转换到基类对象,那么基类对象访问的是子类的函数,就实现了多态性。

举例:

/// <summary>
    /// 演示类的继承、多态、虚方法、抽象类、抽象方法、密封
    /// 总结:
    /// 0.父类中的方法会沿着继承链被继承,如E()
    /// 1.将子类赋值给父类,即使子类定义了同名方法,父类也会调用自己实现的方法,如F()
    /// 2.将子类赋值给父类,对于可以override的方法,父类会调用最后一次实现,如G()、H()
    /// 3.virtual方法可以被override,如G()
    /// 4.抽象类不能直接新建实例,但可以用子类赋值,如类A
    /// 5.抽象方法必须override并且只能定义在抽象类中,如A.H()
    /// 6.密封类不能被继承,如类C
    /// 7.密封方法可以被继承,如B.H()
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            A a = b;
            C c = new C();

            a.E();//A.E
            a.F();//A.F,调用类A的方法,虽然类B重新定义了F(),但同时也隐藏了继承了来自类A的F()
            a.G();//B.G, 因为方法被类B重写过
            a.H();//B.H, 因为b.H()是a.H()的最后一次实现
            b.E();//A.E, 从父类中继承的方法
            b.F();//B.F, 类B重新定义了F(),并隐藏从类A中继承了F()方法
            b.G();//B.G
            b.H();//B.H
            c.E();//A.E, 从父类中继承的方法
            c.F();//B.F
            c.G();//B.G
            c.H();//C.H, 类C中自定义的方法
            a = c;
            a.E();//A.E
            a.F();//A.F, 调用类A的方法,虽然类B重新定义了F(),但同时也隐藏了继承了来自类A的F()
            a.G();//B.G, 因为方法被类B重写过
            a.H();//B.H, 因为b.H()是a.H()的最后一次实现
            b = c;
            b.E();//A.E, 从父类中继承的方法
            b.F();//B.F, 从父类中继承的方法,虽然类B继承自类A,但类B重新定义了F()
            b.G();//B.G
            b.H();//B.H,
            Console.Read();
        }
    }

    abstract class A //abstract类不可以直接实例化,但可以将其子类赋值给它
    {
        public void E()
        {
            Console.WriteLine("A.E");
        }
        public void F()
        {
            Console.WriteLine("A.F");
        }
        public virtual void G() //virtual方法,子类可以重写
        {
            Console.WriteLine("A.G");
        }
        public abstract void H();//abstract没有实现,继承类必须自己实现
    }
    class B : A
    {
        new public void F() //new 重新定义F()并隐藏继承自类A的F(),可以用来处理子类中与父类方法同名的问题
        {
            Console.WriteLine("B.F");
        }
        public override void G() //重写父类的virtual方法
        {
            Console.WriteLine("B.G");
        }
        public sealed override void H()//实现父类定义的abstract方法并密封
        {
            Console.WriteLine("B.H");
        }
    }
    sealed class C : B
    {
        //public override void H() //被密封的方法不能重写
        //{
       
        //}
        new public void H() // new 重新定义H(),被密封的方法可以继承【语法上是继承,但可以认为没继承,子类定义了一个新方法,名字本质上都不一样了】
        {
            Console.WriteLine("C.H");
        }
    }
    //class D : C //密封类不能继承
    //{
   
    //}

【只有子类方法前加上new关键字,就表示我接下来要写的方法都具有“隐含的前缀名字”,也就不可能和父类任何方法重名,当然上面的理解并不正确却准确的反映了new关键字的功能,它就是表示和父类六亲不认,即断了继承链,完全隐藏了父类的某个方法,让子类完全看不到。以后就可以理解为用new声明的方法是方法名加了new前缀或一个匿名前缀,完全和父类同名的方法没有了任何关系(先理解为编译器级别底层两个方法名都不一样

4、委托-事件-匿名函数

 (1)委托是一种类型,使用时需要委托的实例。事件实际上就是一种委托的事例,只不过为了限制在内部使用在最前面加上了event关键字进行修饰。

下面语句定义了一个委托类型:

delegate void AnimalPlay(string name);

上面的语句和定义一个类的语句作用是一样的,都是定义了一种新的类型,只不过不像定义类那样还需要一个大括号来定义“类体”而已。

实例化委托类型语句如下:

AnimalPlay deleDogPlay=new AnimalPlay(DogPlay);     //DogPlay是一个函数名

从上面语句可以看出,实例化都要用new语句,只不过实例化类传递给构造函数的是一些参数,而实例化委托传递的是一个函数名而已。

使用委托的好处之一是可以实现以函数为参数,提高程序的通用性。

(2)匿名函数:不仅可以使用已有的函数(名)创建委托实例,而且可以直接使用匿名函数创建委托示例,如下语句

委托类型 委托事例=delegate(int , double y){................return xx; };

上面的语句没有使用new和一个函数名来实例化一个委托实例,而是直接将一个“代码块”定义成为一个委托,写法简便而且少用了一个函数名。另外,匿名函数有一个优点,即它不光可以使用代码块内定义的变量,而且可以使用代码块外定义的变量,且外层变量一旦被匿名函数捕获,则它的生命周期将延长至委托实例被销毁为止。【匿名函数就是一个内联的函数,即调用时不存在跳转,直接展开函数内部的所有语句并执行。匿名函数不需要明确定义返回值类型,系统会根据return语句自动推测返回值类型。其实也很好记忆:delegate关键字加上小括号再加上大括号,这个整体表达式就是定义了一个匿名函数,即内联函数,同时这个整体表达式返回一个引用这个函数函数的地址并可以直接赋给一个委托实例。或者就可以认为这个整体表达式就返回一个委托实例。】

(3)事件:事件是委托的实例。常用的系统事件(.Net内部帮我们定义好了的),它的类型声明(即对应的委托)如下:

public delegate void  EventHandler(object sender, EventArgs e);

比如常用的Click事件,它的实例化如下:

public event EventHandler Click=new EventHandler(某个函数名);

因为Control类中已经为我们定义好了Click事件,而所有的控件都继承于Control类,所以所有的控件都有Click事件。

另外,事件最前面使用event修饰是为了将事件的调用限制在事件所属的类的内部。比如不能在类的外部出现“对象.事件();”这样的调用语句,不过当然可以出现“对象.事件;”这样的非调用语句。比如,myButton.Click+=new System.EnentHandler(this.myButton_Click);

 

5、密封

以后再补。

 

6、Lambda表达式

Lambda表达式实际上是一个匿名函数。它包含表达式和语句,常用于创建委托或表达式目录树类型。所有Lambda表达式都是用Lambda运算符---------- =>,该运算符读为“goesto”。Lambda运算符的左边是输入参数(可能没有),右边是表达式或语句块。Lambda表达式返回右边表达式的结果。其基本格式如下:

(input paramenters)=>expression

其中,parameters是一个参数列表,在Lambda只有一个输入参数时可以不使用括号,否则括号是必须的。两个或更多输入参数由括在括号中的逗号分隔,如以下代码所示,包括两个参数x和y。

(x,y)=> x==y    这里参数由系统自动推测

通常Lambda表达式的参数都是可变类型的,由编译器自动确定它的具体类型。但有时编译器难于或无法推断输入类型,就需要为参数显示指定类型,既在参数之前添加参数类型。如下所示的Lambda表达式包括连个参数x和s。其中x是int类型,而s则是string类型。

(int x, string s) =>s.Length > x

当Lanbda表达式没有参数时,需要使用空的括号表示,如下所示。其中,“()”表示没有参数,而Amethod()是一个具体的方法,该方法的返回值就是Lambda表达式的结果。

() => AMethod()

由于Lambda表达式实际是匿名函数,它可以赋值到一个委托,而在IEnumerable<T>的方法中很多都通过函数委托来实现自定义的运算、条件等操作,所以Lambda表达式在Linq中被广泛使用。

使用范例如下:

范例中使用到了Array.FindAll方法,这个方法是Array类的静态方法。

结构:Array.FindAll(被检索的数组,检索条件)

【将数组中的元素一个个的传到检索条件中执行】若数组中所有元素都满足条件,那么返回该数组,否则返回空Array数组。其中检索条件可以是一个表达式,自定义函数名,匿名委托(函数)

 

staticvoidMain(string[] args)

{

    string[] arr = { "aaa","abc","acc"};

    string[] arr1 = Array.FindAll(arr, (s) => s.Contains("a"));

    foreach(stringsinarr1)

      {

        Console.WriteLine(s);

       }

    int[] arr2 = { 1, 2, 3, 4, 5 };

    int[] arr3 = Array.FindAll(arr2,delegate(intx) { returnx % 2 == 0; });

    Array.ForEach(arr3,delegate(intx) { Console.WriteLine(x); });

    string[] arr4 = Array.FindAll(arr1, (s) => { returns.Length > 2; });   //由于只有一个参数,所以s两边的括号都可以省略不写

    foreach(stringsinarr4)

       {

        Console.WriteLine(s);

       }

}

【从上面可以看出,Lambda表达式整体就可以看成一个匿名函数,即这个表达式整体返回一个匿名函数地址并可以直接赋给一个委托实例,而且使用起来更方便,因为它的参数类型都可以不用写,系统根据真正调用这个匿名函数并赋给实参时,自动推测出这个形参的类型,而且Lambda不用写return,它自动返回表达式的结果】

 

 

如何用Deep OC-SORT提升多目标跟踪精度?实战配置与性能优化指南 本文是一份针对开发者的Deep OC-SORT多目标跟踪实战指南。详细解析了如何通过部署其核心的“动态外观记忆”与“相机防抖”模块来有效应对遮挡与抖动,从而显著提升跟踪精度与连续性。内容涵盖从环境搭建、参数调优到性能压榨的全流程,并提供针对不同场景的配置建议与工程落地技巧。 阅读详情

相关推荐

cherry使用MCP协议Streamable HTTP实践

摘要:Streamable HTTP协议是针对传统HTTP+SSE传输方式的改进方案,解决了连接恢复、服务器资源占用和单向通信等问题。该协议基于普通HTTP实现,支持无状态服务器、纯HTTP服务和多轮对话,同时兼容现有基础设施。通过演示展示了服务端和客户端的配置方法,体现了其灵活性和实用性。MCP(多轮对话协议)作为扩展LLM能力的关键技术,代表着未来交互式AI的发展趋势。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 563

C# 静态(Static )方法 、重写(override)方法、虚方法(virtual)详解

【代码】C# 静态(Static )方法 、重写(override)方法、虚方法(virtual)详解。

zylgxt的博客 1100

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5085

C#方法重载(overload)、重写(覆盖)(override)、隐藏(new) -第四天

关于这个定义,个人认为还是比较正确的,实际上有的人把 new 的隐藏称为覆盖,这个可能是使用者的角度来说的。但是目前作者还是偏向于 这样的称呼:C#方法重载(overload)、重写(覆盖)(override)、隐藏(new)。 重写(覆盖) 用关键字 virtual 修饰的方法,叫虚方法。可以在子类中用override 声明同名的方法,这叫“重写”。相应的没有用virt

lichuanpeng的博客 1479

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1187

漏检率从23%降至1.3%:YOLOv8交通车辆计数与违章识别完整落地方案

本文分享了基于YOLOv8+ByteTrack的交通视频分析系统实战经验,针对车辆计数和违章识别两大核心功能,提出了完整的工程化解决方案。系统采用边缘计算架构,单张GTX 1660即可稳定处理8路1080P视频流,实现了白天98.7%、夜间96%以上的车辆计数准确率。文章详细剖析了交通视频分析的四大落地痛点,系统架构设计思路,以及遮挡处理、光照适应、多路并发等关键技术优化方案,重点介绍了车辆计数三重校验机制和三类违章识别的工程实现细节。通过ROI裁剪、TensorRT加速、动态抽帧等优化手段,显著提升了系统

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 340

C#-函数的重载&重构&重写

在编码中一个对象一个行为名会有多个行为,比如猴子吃东西的方法,往方法中传入苹果,猴子直接拿起来吃,若传入香蕉需要先剥开再吃。此时猴子类中需要两个方法名相同却执行逻辑不同的方法。比如动物睡觉由小狗小马继承,小狗需要先趴下再睡,小马则是直接站着睡。此时两个子类拥有父类方法,但细节上在该方法下却有不同。

m0_59267625的博客 1375

ABAP CDS HAVING 全解析:聚合之后的精准过滤、最佳实践与可运行示例

摘要: 本文针对具备ABAP与CDS基础的开发者,详解HAVING在ABAP CDS中的核心用法。HAVING专用于过滤GROUP BY后的聚合结果(如SUM、COUNT),与WHERE的分工明确:前者处理聚合值,后者过滤原始记录。通过销售额阈值、质量分析、财务对账三类典型场景,结合性能优化建议(如优先使用WHERE索引过滤),说明实际应用。文中提供经典CDS View与View Entity两种实现代码,并附Open SQL消费示例,帮助开发者快速落地。常见误区(如聚合条件误写至WHERE)与规避方法亦被

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 219

C#静态多态之函数重载

函数重载: 在同一个范围内对相同的函数名有多个定义,必须保持函数名一样 但参数类型或者参数的个数 或者方法的返回值不一样

qq_3517289697的博客 670

【STM32实物】基于STM32设计的智能仓储管理系统

近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,识别以及对仓储环境条件的要求成为仓储的重要决策,他们可以根据不同的特点在不同场景中使用。本文详细介绍了一个基于单片机技术的智能仓储管理系统的设计与实现,这个系统可谓是集射频识别(RFID)技术和环境监测传感器于一身,旨在提高仓储操作的自动化和精确度。

嵌入式阿齐Archie 1万+

【推荐100个unity插件之7】使用BehaviorDesigner插件制作BOSS的AI行为树

Behavior Designer是一个行为树插件,是一款为了让策划,程序员,美术人员方便使用的可视化编辑器。Behavior Designer提供了强大的AP1可以让你轻松的创建tasks(任务),配合uScript和PlayMaker这样的插件,可以不费吹灰之力就能够创建出强大的Al系统,而无需写行代码。(不懂PlayMaker的,我后面在单独出文章介绍一下,可以期待一下)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 6565

Lambda 表达式 C# 编程指南

Lambda 表达式(C# 编程指南) Visual Studio 2010 “Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。 该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。 Lambda 表达式 x => x

luckypeng的专栏 3954

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

C#(自用)

解构简化 教学阐述 玩耍学习 审视错误 定期复习 坚持学习

2401_83723941的博客 412

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C#学习记录——入门到进阶

输入输出 //输出语句:换行输出 Console.WriteLine("hool,word"); Console.WriteLine("hool c#"); //输出语句,无换行输出 Console.Write("hool word"); Console.Write("hool c#"); //

i_like_python3的博客 2946

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【面试】Unity面试题&答案

【面试】Unity面试题&答案

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 2万+

C#面试常问25问

都发C++了,C#也发一下吧,C#人柱力是酱紫的喵。

weixin_73096386的博客 1747

零散知识点

1.值类型和引用类型的区别 值类型的变量赋值时是将真实数据的副本付给变量,而引用类型则是将对象的引用付给变量, 这会产生多个多个变量同时指向一个对象实例 值类型定义时,会在堆栈上分配内存,引用类型会在堆上分配内存 所有的值类型都有共同的基类:System.ValueType.所有值类型都已经实现了类容的比较equals() 方法,而引用类型在没有重写Equals()方法的情况下,任然采用...

weixin_34004576的博客 85

第00章-C#学习大纲

本教程是一份全面系统的 C# 学习指南,从零基础入门到企业级开发实战,涵盖了 C# 语言的核心语法、面向对象编程、高级特性、工程实践以及项目实战等完整知识体系。教程按照循序渐进的方式组织,分为入门篇、进阶篇、高级篇、工程实战篇、项目实战篇和精通篇六个部分,共 35 章,并附有丰富的附录资源。无论你是编程新手还是有一定经验的开发者,都能通过本教程系统掌握 C# 开发技能,构建健壮、可维护的 .NET 应用程序。

qq_31762031的博客 187

LangChain4j 中文文档

欢迎!LangChain4j 的目标是简化将大语言模型集成到 Java 应用中的过程。它的实现方式如下:统一 API: 大语言模型提供商(如 OpenAI 或 Google Vertex AI)和嵌入(向量)存储(如 Pinecone 或 Milvus)都使用专有 API。LangChain4j 提供统一 API,避免你为每个提供商或存储分别学习和实现特定 API。想尝试不同的大语言模型或嵌入存储时,你可以轻松切换,而无需重写代码。LangChain4j 目前支持 20+ 个主流大语言模型提供商 和 30+

qq_43356685的博客 975

java中静态(static)的方法为什么不能重写(override)

父类的普通方法可以被继承和重写,不多作解释,如果子类继承父类,而且子类没有重写父类的方法,但是子类会有从父类继承过来的方法。 静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具

xtjatpsjkkk的专栏 2052

C# 3.0 新特性概览

1. 隐式类型局部变量(Implicitly Typed Local Variables)      隐式类型局部变量的具体类型取决于初始化它的表达式。在一个局部变量声明时,前面加一个var关键字,这个局部变量就被叫做隐式类型局部变量。例如: var i = 0; var s = "Hello"; var d ...

weixin_33826609的博客 124

static方法可以被重写(覆盖)吗?

首先要强调,静态方法是不能被覆盖的。 原因: 在子类中,可以定义与父类同名的静态方法,不过并不存在“多态”,严格的说,方法间没有多态就不能称作“覆盖”。所以说,子类的静态方法,并没有覆盖父类的方法。 package com.ren.staticTest; public class StaticExtends { public static void main(Strin

u012246178的博客 1万+

C++ 类中静态成员和静态成员函数的继承覆盖

C++中子类是否可以继承父类的静态成员和静态成员函数?

weixin_44477424的博客 9276

c# --- 继承与重写函数

1. 实现继承其实就是类的继承 ---- 父类(基类),子类(派生类)2.子类中重写父类函数的实现代码后,再通过子类调用这个函数的话,就能够执行重写后的代码了3.c#不支持多重类继承,但支持多重接口继承4.在c#中每一个类都必须具有一个父类,且只能有一个父类。当你没有给一个类指定父类的时候,编译器就会给这个类指定一个默认的父类 Object ,如果给一个类指定了一个父类后,Object父类就会被替代,然后新的父类不会出现被替代的情况。......

qq_51947882的博客 2417

静态(static)方法的继承和重写

1、父类方法如果是静态方法,子类不能覆盖为非静态方法; 2、父类方法如果是非静态方法,子类不能覆盖为静态方法; 3、父类静态方法可以被覆盖,允许在子类中定义同名的静态方法,但是没有多态。

bxw1992的博客 2922
上一篇: c#中using-添加引用-程序集(详解) 以及与 c++中include等区别
下一篇: vs2008如何新建自己工程的环境变量(局部)和 Windows系统(全局)
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值