面向对象有三大特征:继承,封装,多态。
什么是多态?
多态就是对象可以表现多个类型的能力
实现多态有三种手段:
1、虚方法
2、抽象类
3、接口
一、虚方法
看一段代码
namespace 多态 { public class Program { static void Main(string[] args) { Person p = new Person("人类"); p.Show(); Chinese china = new Chinese("中国人"); p.Show(); Console.ReadKey(); } } public class Person { public string Name { get; set; } public Person(string name) { this.Name = name; } public void Show() { Console.WriteLine("我叫{0}", this.Name); } } public class Chinese : Person { public Chinese(string name) : base(name) { } public void Show() { Console.WriteLine("我叫{0}",base.Name); } } public class Japanese : Person { public Japanese(string name) : base(name) { } public void Show() { Console.WriteLine("我是{0}",base.Name); } } }
可以发现其中的方法名字跟父类的名字一样。运行的时候发现子类方法报绿线错误,
如果子类的方法跟子类的方法名相同,那么子类会默认的将父类的方法隐藏掉,解决方法有两种
1.new关键字
1).new的作用:隐藏子类从父类继承过来的方法。
//子类的类 public class Japanese : Person { public Japanese(string name) : base(name) { } //方法这里加一个new关键字 public new void Show() { Console.WriteLine("我是{0}",base.Name); } }
2。使用虚方法
1)、将父类的方法标记为virtual 表示这个父类的方法可以被子类重写
//父类的方法 public class Person { public string Name { get; set; } public Person(string name) { this.Name = name; } //父类的方法加virtual public virtual void SayHello() { Console.WriteLine("大家好,我叫{0},我是人类", this.Name); } }
2)、将子类的方法标记为override 表示重写父类的方法
//子类的方法 public class Chinese : Person { public Chinese(string name) : base(name) { } //子类的方法中加override 实现虚方法 public override void SayHello() { Console.WriteLine("大家好,我叫{0},我是中国人", this.Name); } }
虚方法与重写
1、方法不能用static修饰
2、方法重写与基类的签名必须一致
3、virtual不能与private一起使用
4.虚方法为什么不能加static因为 虚方法是父类,加static,那么就是类调用这个方法,和对象无关了,那子类就调不了.
常见虚方法:Equal()ToString()GetHashCode()
override与重载(overload)的区别
重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。Override 是进行基类中函数的重写。Override是面向对象的概念
二、抽象类抽象类与抽象方法由abstract修饰abstract的使用注意1,抽象方法没有方法体2.抽象成员只能存在于3.抽象类中抽象类可以有非抽象成员4.抽象类的派生类必须实现抽象方法体5.抽用作基类,无法实例化