override和overload的区别(重写和重载的区别)转载

override和overload的区别(重写和重载的区别)

又是这种面试中强制拿来作对比概念性问题,上学的时候自己也进行过对比.有点跟风现象,知其然不知其所以然.

几年后的今天看着博客园上自己零零散散的积累了很多问题,闲暇下来重新整体和修改一番。

override与overload个人认为本质上是完全不同两个概念,只是关键字相似让一些面试的人来迷惑一些面试者,

当然,当年我也是其中的一员,只是当年认识的比较片面.

硬要是做下区分的话可以从这几个方面入手:

①方向性----override是纵向的,overload是横向的。

为什么这么说,override都是跟继承有关系的,子类使用父类的方法,但又要有子类自己的实现方式只与父类的方法名称和参数保持一致,

其余一概自己说了算。是一种自上而下,层层关联,所以说它是纵向的。

For Example

--->

1 public class Person
2 {
3 public virtual void IntroduceSelf()
4 {
5 Console.WriteLine("I'm a person");
6 }
7 }
8
9
10  public class Child : Person
11 {
12 public override void IntroduceSelf()
13 {
14 Console.WriteLine("I'm a Child ");
15 }
16 }

再来说overload,显而易见一提到重载这个概念多半跟多态挂边,一般都是方法的重载,同名方法不同参数,

不同返回类型即实现了方法的重载,所以说是一种平行的关系即是横向的。

For Example

--->

1 public class Main
2 {
3 public void Test(int value_a, int value_b)
4 {
5 }
6
7 public void Test(string value_str)
8 {
9 }
10
11 public string Test()
12 {
13 return "Test";
14 }
15 }

②表现形式

1 方法名 必须相同 必须相同
2 参数列表 必须相同 必须不同
3 返回值 必须相同 可以不同

附:各自使用指南以及范例

override使用指南

①要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。

不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。

override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。

不能使用 new、static、virtual 或 abstract 修饰符来修改 override 方法。

重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。

For Example

--->

 1 abstract class ShapesClass
2 {
3    abstract public int Area();
4 }
5
6  class Square : ShapesClass
7 {
8    int side = 0;
9
10    public Square(int n)
11    {
12        side = n;
13    }
14  
15    public override int Area()
16    {
17        return side * side;
18    }
19 } 

 

overload使用指南

①用方法重载来提供在语义上完成相同功能的不同方法

②使用方法重载而不是允许默认参数。默认参数的版本控制性能不好,因此公共语言规范(CLS)中不允许使用默认参数。

③正确使用默认值。在一个重载方法系列中,复杂方法应当使用参数名来指示从简单方法中假定的默认状态发生的更改。

④对方法参数使用一致的排序和命名模式。提供一组重载方法,这组重载方法带有递增数目的参数,以使开发人员可以指定想要的级别的信息,这种情况很常见。您指定的参数越多,开发人员就可指定得越详细。

⑤如果必须提供重写方法的能力,请仅使最完整的重载是虚拟的并根据它来定义其他操作。

For Example

--->

1 public class TestClass
2 {
3 private string str_temp;
4
5 public void TestClass(string s)
6 {
7 this.str_temp= s;
8 }
9
10 public int IndexOf(string s)
11 {
12 return IndexOf (s, 0);
13 }
14
15 public int IndexOf(string s, int startIndex)
16 {
17 return IndexOf(s, startIndex, str_temp.Length-startIndex );
18 }
19
20 public virtual int IndexOf(string s, int startIndex, int count)
21 {
22 return str_temp.IndexOf(s, startIndex, count);
23 }
24 }
1 abstract class ShapesClass
2 {
3 abstract public int Area();
4 }
5
6  class Square : ShapesClass
7 {
8 int side = 0;
9
10 public Square(int n)
11 {
12 side = n;
13 }
14
15 public override int Area()
16 {
17 return side * side;
18 }
19 }

posted @ 2011-03-12 10:12  勇气  阅读(1890)  评论(2编辑  收藏  举报