3.都不会影响父类自身的方法

时间:2022-01-01 09:08:18

  刚接触C#编程,我也是被override与new搞得晕头转向。于是花了点时间翻资料,看博客,终于算小有领悟,把学习条记记录于此。

  首先声明一个父类Animal类,与担任Animal的两个子类Dog类与Cat类。父类Animal中有一个Say要领,而子类Dog与Cat分袂override(重写)与new(笼罩)了Say要领。

  让我们通过实例来看一下这两者有什么不异与差别之处。

1 public class Animal 2 { 3 public virtual void Say() 4 { 5 Console.WriteLine("Hello,Animal"); 6 } 7 } 8 public class Dog : Animal 9 { 10 public override void Say() 11 { 12 Console.WriteLine("Hello,Dog"); 13 } 14 } 15 public class Cat : Animal 16 { 17 public new void Say() 18 { 19 Console.WriteLine("Hello,Cat"); 20 } 21 }

首先说override与new的配合点:

都是子类在从头实现父类中签名不异的要领时使用。

当声明一个子类东西时,挪用这个要领,挪用的都是子类中实现的要领。

    例如:

1 class Program 2 { 3 static void Main(string[] arge) 4 { 5 Dog d = new Dog(); 6 Cat c = new Cat(); 7 d.Say();//挪用override的要领 8 c.Say();//挪用new的要领 9 } 10 }

   输出是:

Hello,Dog Hello,Cat

    此时挪用的分袂是Dog与Cat类中实现的Say要领。

  3.都不会影响父类自身的要领。

   如:

1 class Program 2 { 3 static void Main(string[] arge) 4 { 5 Animal a = new Animal(); 6 a.Say();//挪用父类要领。未受影响。 7 } 8 }

  此时的输出是:

Hello,Animal

下面说两者的差别之处:

  1.

  (1)override:父类要领必需用virtual修饰,暗示这个要领是虚要领,可以被重写。否则不能被重写。

  (2)new :   父类要领不必使用virtual修饰。

  2.

  (1)override : 使用override时,父类中必需存在签名完全不异的virtual要领。否则编译欠亨过。

    如果我在Dog类的Say增加一个string类型的形参,则编译器会提示:没有合适的要领可以重写。

3.都不会影响父类自身的方法

  (2)new :   使用new时,父类中最好存在签名不异的要领。如果没有,VS会有提示,但编译不会报错。此时,new关键字便没有了意义。

   如果我在Cat类的Say增加一个string类型的形参,VS会提示:new关键字不是必需的。

3.都不会影响父类自身的方法

  3.当子类中存在与父类要领签名不异的要领,而没有被override或new修饰时,默认为new。

  也就是说,override必需写,而new可以不写(不保举)。

  4.这是最重要的一点。以上三点都是使用要领的区别,而这一点是两者在实际使用时效果的区别。

  (1)override :重写后,当子类东西转换为父类时,无法访谒被重写的虚要领。也就是,被子类重写后,虚要领在这个子类中便掉效了。

   如:

class Program { static void Main(string[] arge) { Dog d = new Dog(); Animal a = d as Animal;//子类转换为父类。注意此时a与d指向同一东西,但d是作为Dog类访谒,而a是作为Animal类访谒 d.Say();//此时挪用的是override的要领 a.Say();//此时挪用的也是override的要领 } }

    输出为:

Hello,Dog Hello,Dog

  两次挪用的都是Dog中重写的Say要领