A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔡军 中级黑马   /  2012-3-11 20:05  /  1621 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

虚拟方法和重写方法有什么区别,各都有什么作用?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

2 个回复

倒序浏览
虚方法就是允许被其子类重新定义的方法,在声明时,需要使用virtual修饰符。virtual修饰符不能与static、abstract或者override和private修饰符同时使用。
重写方法声明中含有override修饰符,它主要用来使用相同的签名重写继承的虚方法。
区别是:虚方法主要用来引入新方法,而重写方法是提供虚方法的具体实现的。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
1.
父类:public virtual string ToString(){return "a";}
子类:public override string ToString(){return "b";}
2.
同一类中或父子关系类中皆可:
public string ToString(){return "a";}
public string ToString(int id){return id.ToString();}

override是用于重写基类的虚方法,这样在派生类中提供一个新的方法

重载是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制


1. override
-----------
使用 override 修饰符来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。

不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。

也就是说,用 override 修饰符重写的基类中的方法必须是 virtual, abstract 或 override 方法。



2. 重载
-------
当类包含两个名称相同但签名不同的方法时发生方法重载。

使用重载方法的指南:
a. 用方法重载来提供在语义上完成相同功能的不同方法。
b. 使用方法重载而不是允许默认参数。默认参数的版本控制性能不好,因此公共语言规范(CLS)中不允许使用默认参数。
c. 正确使用默认值。在一个重载方法系列中,复杂方法应当使用参数名来指示从简单方法中假定的默认状态发生的更改。
d. 对方法参数使用一致的排序和命名模式。提供一组重载方法,这组重载方法带有递增数目的参数,以使开发人员可以指定想要的级别的信息,这种情况很常见。您指定的参数越多,开发人员就可指定得越详细。
e. 如果必须提供重写方法的能力,请仅使最完整的重载是虚拟的并根据它来定义其他操作。
// 下面具体解释一下这种模式,只有最后一个方法(参数最完整的方法)是虚方法,在继承了这个类的子类中只要重写(override)这个方法就行了。

public class SampleClass
{
   private string myString;

   public SampleClass(string str)
   {
      this.myString = str;
   }

   public int IndexOf(string s)
   {
      return IndexOf (s, 0);
   }

   public int IndexOf(string s, int startIndex)
   {
      return IndexOf(s, startIndex, myString.Length - startIndex );
   }

   public virtual int IndexOf(string s, int startIndex, int count)
   {
      return myString.IndexOf(s, startIndex, count);
   }
}

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马