黑马程序员技术交流社区

标题: C#中区别多态、重载、重写(二) [打印本页]

作者: sunrise2    时间: 2014-7-23 23:57
标题: C#中区别多态、重载、重写(二)
        接 C#中区别多态、重载、重写(一) http://bbs.itheima.com/thread-132119-1-1.html
     override重写特性:
      由 override 声明重写的方法称为重写基方法,重写的基方法必须与 override 方法具有相同的签名。
       重写的基方法必须是 virtual、abstract 或 override 的,不能重写非虚方法或静态方法。
      override的方法和virtual的方法必须具有相同的访问级别修饰符,不能更改 virtual 方法的可访问性。
     不能使用new、static 或 virtual 修饰符来修改 override 方法。
      重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract 或 override 的。
覆盖示例:
当我们没有使用覆盖时,派生类继承基类,结果如下:

  1. class A
  2.     {
  3.         public void Fun()
  4.         {
  5.             Console.WriteLine("I am F");
  6.         }
  7.     }
  8.     class Program:A
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Program p = new Program();
  13.             p.Fun();
  14.             Console.Read();
  15.         }
  16.     }
  17. //结果为:I am F
复制代码

当我们覆盖原来的方法呢?

  1. class A
  2.     {
  3.         public void Fun()
  4.         {
  5.             Console.WriteLine("I am F");
  6.         }
  7.     }
  8.     class Program:A
  9.     {
  10.         public new void Fun()
  11.         {
  12.             int i = 1;
  13.             Console.WriteLine("I am F,i={0}", i);
  14.         }
  15.         static void Main(string[] args)
  16.         {
  17.             Program p = new Program();
  18.             p.Fun();
  19.             Console.Read();
  20.         }
  21.     }
  22. //结果为:I am F,i=1
复制代码
    new覆盖与重写、重载的区别:
     当子类与父类的参数不同时
     当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载)
     当基类函数是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载;因为参数不同,所以不是重写)
     当子类与父类的参数相同时
     当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载,因为基类不是虚函数,所以是隐藏不是重写)
     当基类函数是虚函数时,基类函数将被覆盖。(因为子类和基类不在同一范围内,所以不是重载)
     那么为什么不是重写呢?我们可以做一个例子还测试一下,这个例子在虚函数时已经举过,在这里为了说明此问题在重复一下:
  1. class A
  2.     {
  3.         public virtual void Fun()
  4.         {
  5.             Console.WriteLine("I am F");
  6.         }
  7.     }
  8.     class Program:A
  9.     {
  10.         public override void Fun()
  11.         {
  12.             int i = 1;
  13.             Console.WriteLine("I am F,i={0}", i);
  14.         }
  15.         static void Main(string[] args)
  16.         {
  17.             A p = new Program();
  18.             p.Fun();
  19.             Console.Read();
  20.         }
  21.     }
复制代码










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2