黑马程序员技术交流社区

标题: 当子类中存在和父类中同名的方法怎么办? [打印本页]

作者: ┾——黑马    时间: 2013-9-29 10:52
标题: 当子类中存在和父类中同名的方法怎么办?
本帖最后由 ┾——黑马 于 2013-9-29 14:44 编辑

当子类存在和父类同名的方法时,会报错吗?调用的是子类还是父类中的方法?
作者: 段朝骞    时间: 2013-9-29 11:32
子类中存在和父类的同名同签名方法时,会出现警告,子类方法将会隐藏人类同名同参方法
可以使用new关键字消除警告
当父类引用子类对象时,调用的是父类方法
当子类引用子类对象时,调用的是子类方法
当父类引用父类对象时,调用的是父类方法
例如:
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             B b = new B();
  6.             A a = b;
  7.             A a1 = new A();
  8.             b.Say();  //打印出B
  9.             a.Say();  //打印出A
  10.             a1.Say(); //打印出A
  11.             Console.ReadKey();
  12.         }
  13.         class A
  14.         {
  15.             public void Say() { Console.WriteLine("A"); }
  16.        }
  17.         class B : A
  18.         {
  19.            new public void Say() { Console.WriteLine("B"); }
  20.         }
  21.     }
复制代码

作者: 于振发    时间: 2013-9-29 14:21
子类中存在和父类的同名同签名方法时 ,又称重写,就是在子类中重复定义父类方法,提供不同实现,存在于有继承关系的父子关系。当子类重写父类的虚函数后,父类对象就可以根据根据赋予它的不同子类指针动态的调用子类的方法。从示例的分析,总结覆写的基本特征包括:

  在.NET中只有以virtual和abstract标记的虚方法和抽象方法才能被直接覆写。

  覆写以关键字override标记,强调继承关系中对基类方法的重写。

  覆写方法要求具有相同的方法签名,包括:相同的方法名、相同的参数列表和相同的返回值类型。

  概念:虚方法 虚方法就是以virtual关键字修饰并在一个或多个派生类中实现的方法,子类重写的虚方法则以override关键字标记。

  虚方法调用,是在运行时确定根据其调用对象的类型来确定调用适当的覆写方法。.NET默认是非虚方法,如果一个方法被virtual标记,则不可再被static、abstrcat和override修饰。 概念:抽象方法 抽象方法就是以abstract关键字修饰的方法,抽象方法可以看作是没有实现体的虚方法,并且必须在派生类中被覆写,如果一个类包括抽象方法,则该类就是一个抽象类。因此,抽象方法其实隐含为虚方法,只是在声明和调用语法上有所不同。abstract和virtual一起使用是错误的。

 

  重载,就是在同一个类中存在多个同名的方法,而这些方法的参数列表和返回值类型不同。值得注意的是,重载的概念并非面向对象编程的范畴,从编译器角度理解,不同的参数列表、不同的返回值类型,就意味着不同的方法名。也就是说,方法的地址,在编译期就已经确定,是这一种静态绑定。从示例中,我们总结重载的基本特征包括:

  重载存在于同一个类中。

  重载方法要求具有相同的方法名,不同的参数列表,返回值类型可以相同也可以不同(通过operator implicit 可以实现一定程度的返回值重载,不过不值得推荐)。

  .NET 2.0引入泛型技术,使得相同的参数列表、相同的返回值类型的情况也可以构成重载。



作者: 追梦无悔    时间: 2013-9-30 00:36
不会保错,会有警告的哦,你可以在子类中加new关键字就可以解除警告。如果不加new的话是不会影响运行的。




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