1.方法的重载一般发生在类内部,同样的方法名,有不同的参数与返回类型,
2.方法的重写发生在子类对于父类抽象方法/虚方法的重写,重写的方法都有前缀override,父类一旦包含抽象方法,必然为抽象类,包含虚方法可以为普通类,当然静态类中也可以有有普通的方法.方法的重写一般会碰到实例化调用方法的问题.
例如:当子类Son重写(override)了父类的hit()方法时
(1)
Parent p=new Parent();
p.hit(); 执行父类方法
(2)
Parent p=new Son();
p.hit(); 执行子类方法
(3)
Son s=new Son();
s.hit(); 执行子类方法
(4)
Son s=new Parent(); 注意此种情况是不存在的 不可能通过new父类返回一个子类
s.hit();无效
对比 (2)(4)两种情况我们分析下
new son()可以被降级为Parent的实例这个很好理解 因为Son基于继承关系中肯定有所有Parent中的方法,这也很好的解释(4)为何不存在,因为new Parent()产生的实例未必会包含子类自己扩展出的方法,所以写法违法.
3.对于(2)中执行子类的方法 则可以对比重写与覆盖的区别
子类对父类方法的重写(override)当Parent的实例是通过new Son()产生时,会第一时间去子类中找对应的方法,如果此方法在父类中是个虚方法,则子类可能没有重写,在子类中找不到时才会去父类中寻找.
例如:当子类Son覆盖(new)了父类的hit()方法时
(1)
Parent p=new Parent();
p.hit(); 执行父类方法
(2)
Parent p=new Son();
p.hit(); 执行父类方法
(3)
Son s=new Son();
s.hit(); 执行子类方法
(4)
Son s=new Parent(); 注意此种情况是不存在的 不可能通过new父类返回一个子类
s.hit();无效
回顾下构造函数的子父类的执行关系:
public class Parent
{
private void Start()
{
}
private void Update()
{
}
public Parent()
{
Test();
}
protected virtual void Test()
{
Debug.Log("父类Test方法");
}
}
public class Son : Parent
{
private void Start()
{
}
private void Update()
{
}
protected override void Test()
{
Debug.Log("子类Test方法");
}
}