多态基础
多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
用通俗的语句来讲,多态是就是对于同一对象可以表现处多种状态,在调用该对象时可以根据具体的子类来进行调用
多态的好处就是能增加程序的扩展性,配合继承来说,可以让子类继承父类的同时,自己重写其方法,从而实现其方法的多态显示
理论讲解你可以不太理解,配合实例可能会更加透彻
实现多态的方法
实现多态的方法主要有三种:
1)虚方法
2)抽象类
3)接口
虚方法
虚方法就是将父类的方法标记为虚方法,使用关键字Virtual,从而可以使该函数能被子类重新定义(子类前加上关键字override),从而可以实现对方法的重新定义
因此,在调用不同的子类时,可以实现调用不同子类对象中的方法
虚方法实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _05多态
{
class Program
{
static void Main(string[] args)
{
#region 多态的引入
Chinese cn1 = new Chinese("韩梅梅");
Chinese cn2 = new Chinese("李雷");
Japanese j1 = new Japanese("山本冈木");
Japanese j2 = new Japanese("渡边一树");
Korea k1 = new Korea("金秀贤");
Korea k2 = new Korea("李钟硕");
America a1 = new America("科比布莱恩特");
America a2 = new America("特朗普");
Person[] pers = { cn1, cn2, j1, j2, k1, k2, a1, a2 };
for (int i = 0; i < pers.Length; i++)
{
pers[i].SayHello();//此时均为父类的函数
//如果需要子类的函数
if(pers[i] is Chinese)
{
((Chinese)pers[i]).SayHello();
}
else if(pers[i] is Japanese)
{
((Japanese)pers[i]).SayHello();
}
else if(pers[i] is Korea)
{
((Korea)pers[i]).SayHello();
}
else
{
((America)pers[i]).SayHello();
}
}
Console.ReadKey();
#endregion
//多态:让一个对象能够表现出多种的状态(类型)
}
}
public class Person
{
string _name;
public string Name { get => _name; set => _name = value; }
public Person(string name)
{
this.Name = name;
}
public virtual void SayHello()
{
Console.WriteLine("我是人类");
}
}
public class Chinese:Person
{
public Chinese(string name)
:base(name)
{
}
public override void SayHello()
{
Console.WriteLine("我是中国人,我叫{0}",this.Name);
}
}
public class Japanese:Person
{
public Japanese(string name)
:base(name)
{
}
public override void SayHello()
{
Console.WriteLine("我是日本人,我叫{0}",this.Name);
}
}
public class Korea:Person
{
public Korea(string name)
:base(name)
{
}
public override void SayHello()
{
Console.WriteLine("我是韩国人,我叫{0}",this.Name);
}
}
public class America:Person
{
public America(string name)
:base(name)
{
}
public override void SayHello()
{
Console.WriteLine("我是美国人,我叫{0}",this.Name);
}
}
}
注:
1)虚方法必须要有实现,哪怕是空实现
//空实现
public virtual void SayHello()
{
}
2)子类可以不加override,即不重写方法