虚方法与重写方法的使用

C#中的多态性在实现时主要是通过在子类(派生类)中重写基类的虚方法或函数成员来实现的,那么这里就遇到两个概念,一个是虚方法,另一个是重写方法,而这两个方法也是多态中最重要的两个概念,下面分别对它们进行讲解。

1.虚方法

虚方法就是允许被其子类重新定义的方法,在声明时,需要使用virtual修饰符。

注意:

(1)virtual修饰符不能与static、abstract或者override修饰符同时使用;

(2)由于虚方法不能是私有的,所以,virtual修饰符不能与private修饰符同时使用。

  使用virtual修饰符声明一个虚方法,用来计算两个数的和,代码如下:

public virtual int Add(int x, int y)                         //定义一个虚方法
{
       return x + y;                                                //返回两个数的和

}

2.重写方法

如果一个方法声明中含有override修饰符,则称该方法为重写方法,它主要用来使用相同的签名重写继承的虚方法。虚方法主要用来引入新方法,而重写方法则使从基类继承而来的虚方法专用化(提供虚方法的具体实现)。

注意:

(1)override修饰符不能与new、static或者virtual修饰符同时使用,另外,重写方法只能用于重写基类中的虚方法,不能用来单独声明方法;

(2)重载和重写是不相同的,重载是指编写一个与已有方法同名,但参数列表不同的方法,而重写是指在派生类中重写基类的虚方法。

  创建一个控制台应用程序,首先定义一个基类,并在其中定义一个虚方法,用来计算两个数的和;然后使Program类继承于BaseClass类,并在该类中重写基类中的虚方法,使其实现计算3个数的和;最后在Main方法中,使用派生类对象实例化基类的一个对象,并使用该基类对象调用派生类中的方法,实现计算3个数的和。代码如下:

 1 class BaseClass                              //定义一个基类
 2 {
 3     public virtual int Add(int x, int y)         //定义一个虚方法
 4     {
 5         return x + y;                           //返回两个数的和
 6     }
 7 }
 8
 9 class Program:BaseClass       //定义一个派生类,继承于BaseClass
10 {
11     static int z = 0;        //定义一个静态变量,用来作为第3个被加数
12     public override int Add(int x, int y)           //重写基类中的虚方法
13     {
14         return base.Add(x, y) + z;         //计算3个数的和
15     }
16
17     static void Main(string[] args)
18     {
19         z = 698;                             //为静态变量赋值
20
21         BaseClass baseclass = new Program();       //使用派生类对象实例化基类对象
22         Console.WriteLine(baseclass.Add(98, 368));            //调用派生类中重写之后的方法
23         Console.ReadLine();
24     }
25 }

说明:

在Main方法中使用基类对象调用的Add方法是在派生中重写之后的方法,这主要是因为虚方法的实现由派生类中的重写方法进行了取代。

技巧:

在派生类中重写基类中的虚方法时,可以使用base关键字调用基类中的虚方法。

http://blog.csdn.net/donetren/article/details/6492983

时间: 2024-08-03 01:23:34

虚方法与重写方法的使用的相关文章

在子类中重载父类的方法(重写方法)

<?php class person{ protected $name; protected $sex; protected $age; function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的名字:".$this->name.":性别:".$this->

C# 隐藏方法和重写方法

1:方法重写:就是在基类中的方法用virtual关键字来标识,然后在继承类中对该类进行重写 (override),这样基类中的方法在子类中已经被重写了,基类中的方法在子类中已经失去了功能 了.当让基类的对象的引用直接指向继承类的对象时(多态性),调用该方法则是调用的继承类中重 写的方法. 2:方法隐藏:无论基类中的方法是否用了virtual关键字,继承类中都可以用new关键字(如果不用new 的话,不会产生错误,但会生成一个编译警告)将基类中的方法隐藏,所谓隐藏就是隐藏,不像重 写,重写就是基类

[转] C# 隐藏方法和重写方法

1:方法重写:就是在基类中的方法用virtual关键字来标识,然后在继承类中对该类进行重写 (override),这样基类中的方法在子类中已经被重写了,基类中的方法在子类中已经失去了功能 了.当让基类的对象的引用直接指向继承类的对象时(多态性),调用该方法则是调用的继承类中重 写的方法. 2:方法隐藏:无论基类中的方法是否用了virtual关键字,继承类中都可以用new关键字(如果不用new 的话,不会产生错误,但会生成一个编译警告)将基类中的方法隐藏,所谓隐藏就是隐藏,不像重 写,重写就是基类

C#隐藏(new)方法和重写(override)方法

在基类调用的时候 隐藏方法还是调用基类的方法 而重写方法调用的就是子类的中的方法 同时,当子类中的方法与父类或者所实现的接口中的扩展方法冲突时,那么此时相当于一个隐藏方法 基类调用或者接口调用的时候使用的还是基类或者接口定义的扩展方法,而非继承类中的“新”方法.

虚方法的重写与普通方法的隐藏的区别;抽象方法和虚方法有什么区别?

两者都可实现对基类方法的重写 ,虚方法在基类中virtual ,在派生类用override关键字修饰,而普通方法的隐藏在基类不用什么修饰符,而在派生类中用new关键字进行重写 ,我想问,它们同样是方法的重写, c#为什么会有两种方法重写方法,这样设计不是重复了呢, 这怎么理解呢? 不重复,首先如果基类里面的virtual方法被子类继承之后,用override重写之后,那么子类里面就只有一个该方法名的方法了.而另一个普通的,就是在子类里面直接通过new 来新建一个方法那叫重载(多态分为重写和重载)

多态、虚方法、重写

多态: 同样都是继承了同一个父类,但是父类中的方法并不使用任何一个子类,那么在这就需要子类重新编写这个方法的主体 1.需要父类同意子类可以重新编写自己的方法,virtual - 虚方法 2.子类只能重写父类允许重写的方法,只能重写虚方法,override - 重写覆盖虚方法 所有的类都可以当做父类,都可以有虚方法 Program   类 using System; using System.Collections.Generic; using System.Linq; using System.

虚方法与两种重写方法的比较

虚方法virtual..override: 1.派生类的方法和基类的方法有相同的签名和返回类型. 2.基类的方法使用virtual标注. 3.派生类的方法使用override标注. class MyBaseClass { virtual pubilc void Print() ... } class MyDerivedClass : MyBaseClass { override pubilc void Print() ... } 注意: 1.重写和被重写的方法必须有相同的可访问性.换一种说法,被

C# 继承实现父类方法、重写、重载

继承是派生类(子类)去实现(重写<override>.重构<new>)基类(父类)的方法或属性.从而获取在派生类中要实现的功能. 子类调用父类构造方法,在父类中有个实现姓名和年龄的构造方法但是中子类也要实现这样的功能这时子类不用再次去写这个功能只要去调用父类的功能即可. public class Person { private string _name = null; private int _age = 0; public Person(string name, int age

多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量

多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写 子类重写父类的方法使用的是override关键字 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { publ