重写
用关键字 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
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”
//重点看这里
Console.WriteLine(c3.GetName());//输出“xiangshu”
#endregion
覆盖
在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。
在子类中用 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
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”
//重点看这里,和上面的重写作比较
Console.WriteLine(c3.GetName());//输出“祥叔”
#endregion
总结
1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改)。
2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。
3:虚方法、实方法都可以被覆盖(new),抽象方法,接口 不可以。
4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。
5:重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。
相关推荐
在C#编程语言中,`new`和`override`关键字在继承关系中扮演着不同的角色,它们用于处理派生类与基类之间的方法和属性。理解这两者的区别至关重要,因为它们直接影响代码的行为。 首先,我们来看看`new`关键字。`new...
在C#编程语言中,`override`、`new` 和 `base` 是三个关键字,它们在处理类继承和方法重写时起着至关重要的作用。理解这三个关键字的关系和用法对于编写可扩展和灵活的代码至关重要。 首先,我们来看 `override` ...
在C#中,我们使用`override`关键字来标记需要重写的方法。对于按钮控件,我们需要关注的是`OnClick`事件处理程序,这是按钮被点击时调用的方法。 1. **基础步骤**:首先,我们需要创建一个继承自`System.Windows....
在C#编程语言中,重写、重载和多态是面向对象编程的三大核心特性,它们对于构建灵活、可扩展的代码结构至关重要。 首先,我们来看“重写”。重写(Override)允许子类对从基类继承来的方法进行重新定义,以便提供...
### C# 下重写 BUTTON 控件 —— XPButton 实现详解 #### 概述 本文主要探讨了如何在C#中使用.NET框架自定义一个按钮控件(`XPButton`)。这种自定义不仅增强了控件的功能性和外观效果,还使得开发人员能够更灵活地...
在C#编程语言中,`new` 和 `override` 关键字被用于实现多态性。多态性是面向对象编程的一个重要特性,它允许子类继承父类的方法并根据自己的需求进行修改或扩展。然而,`new` 和 `override` 在使用时有着本质的区别...
在C#编程语言中,Override和New关键字是用于处理继承关系中方法和属性重定义的重要概念,它们在处理多态性方面起到关键作用。这里我们将深入探讨这两种关键字的用法和区别。 首先,Override关键字用于明确表示派生...
在C#编程语言中,`new`和`override`关键字都是用来处理方法重写和隐藏的,但它们之间存在着显著的区别。这篇文章将深入探讨这两种方式在实现抽象类重写时的具体差异。 首先,我们来看一下抽象类的实现。在C#中,...
在编程语言中,尤其是面向对象的语言如C#,`new`和`override`是两个非常重要的关键字,它们在处理类的继承和多态性时起到关键作用。理解这两个关键字的区别对于编写灵活、可扩展的代码至关重要。 首先,我们来看`...
在C#编程语言中,`new`和`override`关键字都是用来处理方法重写和隐藏的,但它们的行为和用途有所不同。以下是对这两个关键字详细解释的个人总结。 首先,`override`关键字用于重写基类中的虚方法(virtual methods...
C#中重载重写和覆盖的定义与区别 C#中重载、重写和覆盖是三个重要的概念,它们都是在面向对象编程中使用的,但是它们之间有着明显的区别。 一、重载 重载(Overload)是重新加载的意思,指的是同一个类中同名,...
在C#编程语言中,`new`、`override` 和 `virtual` 是三个与继承和多态性密切相关的关键字。理解它们的区别对于编写高效的面向对象代码至关重要。 首先,`new` 关键字主要用作修饰符,有以下作用: 1. 创建对象:`...
在C#编程语言中,`new` 和 `override` 关键字在继承关系中用于处理方法和属性的行为,它们有着显著的区别。以下是这两个关键字的详细解释及其在代码中的应用。 `new` 关键字: 1. **运算符**:`new` 作为运算符时,...
在C#中,我们可以使用`override`关键字来重写基类的虚方法,使用`new`关键字来隐藏基类的方法。 1. **重写(Override)**: - 重写是指子类重新定义基类中的虚方法,以便提供自己的实现。在C#中,只有标记为`virtual...
在C# Winform开发中,有时我们可能需要对标准控件进行自定义,以满足特定需求。例如,标准的TextBox控件在单行模式下默认不显示滚动条,但有些场景下,我们可能希望在单行文本过长时提供滚动条以便用户查看全部内容...
在C#中,通过虚方法实现多态的一种方式是通过方法的覆盖(Override)。 - **虚方法**:在基类中声明为`virtual`的方法,可以在派生类中通过`override`进行重写,从而实现在不同类型的对象上调用同一名称的方法时...
C#实现URL重写时,我们需要创建一个路由类,继承自`RouteBase`,并覆盖其`GetRouteData`和`GetVirtualPath`方法。例如: ```csharp public class CustomRoute : RouteBase { public override RouteData ...
在.NET Framework中,C#是一种常用的编程语言,用于开发Windows应用程序。在开发这些应用程序时,`DataGridView`控件经常被用来展示数据表格。这个控件提供了丰富的功能,包括数据的编辑、排序、过滤等。然而,有...