多态:相同的操作在不同对象中产生不同结果。多态使用虚方法、抽象实现。
(1)虚方法(Virtual)、重写(Override):针对多态而言,即多态通过虚方法实现。
注:在父类中定义为虚方法。在子类中重写方法。
例:
class TrafficTool //定义父类
{
public virtual void Run() //定义两个虚方法,因为所有TrafficTool的子类都具有Run和Stop这两个功能
{
Debug.Log("Run");
}
public virtual void Stop()
{
Debug.Log("Stop");
}
}
class Car:TrafficTool //定义car类,继承自TrafficTool
{
public override void Run() //重写父类中的Run方法,虽然Car也具有Run功能,但是需要与别的子类中的Run区分
{
Debug.Log("Car Run");
}
public override void Stop() //重写父类中的Stop方法。
{
Debug.Log("Car Stop");
}
}
class Plane:TrafficTool
{
public override void Run() //重写父类中的Run方法。
{
Debug.Log("Plane Run");
}
public override void Stop() //重写父类中的Stop方法。
{
Debug.Log("Plane Stop");
}
}
class Driver //定义Driver类,用以调用
{
public void Drive(TrafficTool tool) //定义Drive方法,定义TrafficTool类型参数,以通用所有不同的方法。
{
tool.Run();
tool.Stop();
}
}
class Manager:MonoBehavior
{
Driver d1 = new Driver();
d1.Drive(new Cae());
d1.Drive(new Plane());
}
注:TrafficTool是父类,Car类和Plane类都继承自TrafficTool类,他们都具有父类的基本功能,即Run()和Stop()两个方法。但是Car和Plane的Run、Stop明显是不一样的。
所以将TrafficTool的方法定义为虚方法,将两个子类的方法重写以区分。最后,定义Driver类用以使用以上类。所使用的参数为TrafficTool类型,此处可以理解为一种通用模式,即,不管传入的参数为Car类还是Plane类,都可以调用对应的方法。
(2)抽象(父类抽象、方法抽象,即在父类中的方法只能是抽象方法,不能实现,在子类中通过重写实现)
父类 abstract claa Shape()
{
public abstract void GetVolume();
public abstract void Length();
}
注:抽象方法必须存在于抽象类中,在父类中抽象方法,不能实现方法。
子类class Circle : Shape
{
public float radious;
public Circle(float r) //构造函数,初始化半径值
{
this.radious = r;
}
public override void GetVolume() //在子类中重写实现父类中抽象的方法
{
Debug.Log("Mathf.PI * Mathf.Pow(radious,2)");
}
public override void Lengtg()
{
Debug.Log("2 * Mathf.PI * radious");
}
}
class Manager : MonoBehavior
{
Shape shape = new Circle(10);
shape.GetVolume();
shape.Length();
}