使用new关键字来做调用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public class Aminal { public string Name; // 定义宠物的名字 public void PrintName() { Console.WriteLine("宠物的名字:" + Name); } } // Dog继承Aminal类 public class Dog : Aminal { // 隐藏父类的PrintName new public void PrintName() { Console.WriteLine("名字为:" + Name); } } static void Main(string[] args) { // 使用new关键字隐藏,取决于通过什么类型的调用 //Dog dog = new Dog(); // 打印的是使用Dog里面的PrintName的方法 Aminal dog = new Dog(); // 调用的是Aminal里面的PrintName的方法 dog.Name = "your name"; dog.PrintName(); } } }
使用vitual虚方法和override重写
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public class Aminal { public string Name; // 定义宠物的名字 // 定义虚方法 virtual public void PrintName() { Console.WriteLine("宠物的名字:" + Name); } } // Dog继承Aminal类 public class Dog : Aminal { // 重写 public override void PrintName() { // base.PrintName(); // 这个是调用父类的虚方法 Console.WriteLine("这是重写方法,{0}", this.Name); } } static void Main(string[] args) { Aminal dog = new Dog(); // 输出的是重写方法的内容 dog.Name = "your name"; dog.PrintName(); } } }
虚方法需要注意的地方:
1.重写虚方法必须要使用相同的可访问属性,如:private就不可以
2.不能重写static和非虚方法
3.方法、属性、索引器、事件都可以使用虚方法重写
override:重写父类的方法。
new:用来隐藏父类的方法。
主要区别在于:override不管使用的是父类声明还是子类声明,调用的都是override重写后的方法;new则不一样,如果声明时使用的是父类,那么姜辉调用父类的virtual方法,如果使用的是子类声明,那么调用的是子类new声明的方法。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace ConsoleApplication3 { class OneClass { public virtual void a_func() { Console.WriteLine("这是virtual方法..."); } } class TwoClass : OneClass { public override void a_func() { Console.WriteLine("这是override方法..."); } } class ThreeClass : OneClass { public new void a_func() { Console.WriteLine("这是new方法..."); } } class Program { static void Main(string[] args) { // 子类声明 OneClass a = new OneClass(); a.a_func(); // 输出"这是virtual方法..." TwoClass b = new TwoClass(); b.a_func(); // 输出"这是override方法..." ThreeClass c = new ThreeClass(); c.a_func(); // 输出"这是new方法..." // 上面三种都很容易理解。 // 关键是下面这两种,父类声明 OneClass d = new TwoClass(); d.a_func(); // 输出"这是override方法..." OneClass e = new ThreeClass(); e.a_func(); // 输出"这是virtual方法..." Console.ReadKey(); } } }