接 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 的。
覆盖示例:
当我们没有使用覆盖时,派生类继承基类,结果如下:
- class A
- {
- public void Fun()
- {
- Console.WriteLine("I am F");
- }
- }
- class Program:A
- {
- static void Main(string[] args)
- {
- Program p = new Program();
- p.Fun();
- Console.Read();
- }
- }
- //结果为:I am F
复制代码
当我们覆盖原来的方法呢?
- class A
- {
- public void Fun()
- {
- Console.WriteLine("I am F");
- }
- }
- class Program:A
- {
- public new void Fun()
- {
- int i = 1;
- Console.WriteLine("I am F,i={0}", i);
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- p.Fun();
- Console.Read();
- }
- }
- //结果为:I am F,i=1
复制代码 new覆盖与重写、重载的区别:
当子类与父类的参数不同时
当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载)
当基类函数是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载;因为参数不同,所以不是重写)
当子类与父类的参数相同时
当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载,因为基类不是虚函数,所以是隐藏不是重写)
当基类函数是虚函数时,基类函数将被覆盖。(因为子类和基类不在同一范围内,所以不是重载)
那么为什么不是重写呢?我们可以做一个例子还测试一下,这个例子在虚函数时已经举过,在这里为了说明此问题在重复一下:
- class A
- {
- public virtual void Fun()
- {
- Console.WriteLine("I am F");
- }
- }
- class Program:A
- {
- public override void Fun()
- {
- int i = 1;
- Console.WriteLine("I am F,i={0}", i);
- }
- static void Main(string[] args)
- {
- A p = new Program();
- p.Fun();
- Console.Read();
- }
- }
复制代码
|
|