`
sangei
  • 浏览: 329051 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

C#中重写(override)和覆盖(new)的区别

阅读更多

重写

用关键字 virtual 修饰的方法,叫虚方法。可以在子类中用override 声明同名的方法,这叫“重写”。相应的没有用virtual修饰的方法,我们叫它实方法。
重写会改变父类方法的功能。
看下面演示代码:
复制代码
复制代码
#region 重写

public class C1
{
    public virtual string GetName()
    {
        return "叔祥";
    }
}

public class C2 : C1
{
    public override string GetName()
    {
        return "xiangshu";
    }
}

 C1 c1 = new C1();
 Console.WriteLine(c1.GetName());//输出“祥叔”

 C2 c2 = new C2();
 Console.WriteLine(c2.GetName());//输出“xiangshu”

 //重点看这里

 C1 c3 = new C2();
 Console.WriteLine(c3.GetName());//输出“xiangshu” 

#endregion
复制代码
复制代码

 

覆盖 
在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。 
覆盖不会改变父类方法的功能。
看下面演示代码:
复制代码
复制代码
#region 覆盖

public class C1
{
    public string GetName()
    {
        return "祥叔";
    }
}

public class C2 : C1
{
    public new string GetName()
    {
        return "xiangshu";
    }
}

C1 c1 = new C1();
Console.WriteLine(c1.GetName());//输出“祥叔”

C2 c2 = new C2();
Console.WriteLine(c2.GetName());//输出“xiangshu”

//重点看这里,和上面的重写作比较

C1 c3 = new C2();
Console.WriteLine(c3.GetName());//输出“祥叔” 

#endregion
复制代码
复制代码

 

总结

1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改)。

2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。

3:虚方法、实方法都可以被覆盖(new),抽象方法,接口 不可以。

4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。

5:重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。

分享到:
评论

相关推荐

    C#中Override关键字和New关键字的用法详解

    C# 语言经过专门设计,以便不同库中的基类与派生类... 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。 如果派生类中的方法前面带有 new 关键

    详解C#用new和override来实现抽象类的重写区别

    本篇文章主要介绍了详解C#用new和override来实现抽象类的重写区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。

    c#方法重写和隐藏的学习示例

    最近正在学习c#,对其中的方法重写和隐藏的概念很是模糊,现在将其归纳如下: 1:方法重写:就是在基类中的方法用virtual关键字来标识,然后在继承类中对该类进行重写(override),这样基类中的方法已经被重写了,...

    重写、隐藏基类(new, override)的方法

    重写、隐藏基类(new, override)的方法,需要的朋友可以参考一下

    c#基础学习问答c#基础学习问答

    7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个...

    两种重写方法的内存机制

    在内存机制上理解 new 和 override/virtual

    C#基础考试题

    1) 在C# 的语法中,( A)关键字可以实现在派生类中对基类的虚函数进行重写. (选择一项) a) override b)new c)static d)virtual 2)关于下面的C# 代码 public static void Main( ) { int p=0; for (int i=1; i;i++) ...

    C#基础概念.doc

    7、override 和 overload 的区别? 9、new 修饰符是起什么作用? 10、this 关键字的含义? 11、可以使用抽象函数重写基类中的虚函数吗? 12、密封类可以有虚函数吗? 13、如果基类中的虚属性只有一个属性访问器,...

    C#25个问题 静态成员和非静态成员的区别等等

    1.静态成员和非静态成员的区别?...11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?

    在一小时内学会 C#(txt版本)

    和 C++ 有所区别的是,C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件中。 看看 C# 中的 Hello World 程序。 复制内容到剪贴板 代码: using System; ...

    你必须知道的C#的25个基础概念(附源码)

    7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一...

    C#中overrid和new修饰符有什么不同

    在C#的继承中尝尝会用到相关的修饰词:override和new。这两个修饰符都可以在新的子类中,重写同名的父类方法。  override: 扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要使用到。  new:在用作...

    C#程序设计试卷.doc

    重写基类的虚方法时,需要同时带上override和virtual修饰符 " "3.如果要定时器控件每一分钟发生一个Tick事件,则InterVal属性应设置为( ) " "A.60 B.600 C.100 D.1000 " "4.用在方法的定义处,以

    C#中二维码实现源代码(修正版)

    改写IsUnicode 和 重写 这个两个虚方法来实现 /// /// 用于判断中文 /// /// <param name="byteData"></param> /// <returns></returns> public static bool IsUnicode(byte[] byteData) { // This is ...

    C#基础概念二十五问

    11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的...

    C#的25个问题(内附代码示例)

    11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的...

    c#学习笔记——学习心得

    密封方法只能用于对基类的虚方法进行实现,声明密封方法时同时使用sealed和override且必须通过重写基类中的虚方法来实现 名称空间:类似java中的包 集合: 代表: 访问修饰符:private、public、protected、...

Global site tag (gtag.js) - Google Analytics