new 与 override的区别 转
转自http://www.cnblogs.com/lifengguo/
"abstract class Base
{
public virtual void work()
{
MessageBox.Show("基类--开始工作");
}
public virtual void outwork()
{
MessageBox.Show("基类--下班");
}
Public abstract void Pay(); //声明抽象方法,必须要被子类new 或 override;只有当类是abstract时才可以声明abstract方法
}
class Employee : Base
{
public new void work()
{
MessageBox.Show("子类(new)--开始工作");
}
public override void outwork()
{
MessageBox.Show("子类(override)下班");
}
}
//测试代码
Employee emp = new Employee();
emp.work(); //子类(new)--开始工作
emp.outwork(); //子类(override)下班
Employee emp = new Employee() ;
Base b = (Base)emp;
b.work(); //基类--开始工作
b.outwork(); //子类(override)下班
new声明的方法,当使用子类的类型来调用的时候,它会运行子类中的函数,而如果类型是基类的话,被隐藏的基类函数就会站到前台来。只有使用virtual定义基类中的函数,并使用override标记子类中的函数,才可以达到想要的多态类(始终调用子类的方法)。
在子类中new父类中的方法,父类中的方法不一定是虚类型,即virtual
但是在子类中override父类中的方法,父类的方法一定得是虚类型,即
借用CSDN网友(CForce)的话:
override-覆盖(旧的没有了)
new-新的(新旧共存)
抽象类与抽象方法
abstract class Animal
{
public abstract void Drink();
public abstract void GotoBed();
}
class Dog : Animal
{
public override void Drink()
{
MessageBox.Show("小狗喝水");
}
public override void GotoBed()
{
MessageBox.Show("小狗睡觉");
}
public override string ToString() //也可:public new string ToString()
{
return "小狗";
}
}
1、 抽象方法,必须要被子override;只有当类是abstract时才可以声明abstract方法
2、 因为abstract方法没有方法实现,其子类只能对其abstract方法进行override,不能new,如果可以new的话,那么类的类型是父类的话,类的方法执行的是父类的方法而非子类的方法,而父类的方法却没有方法实现,那么将如何执行呢?
Selaed 方法必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法
如下,A声明了virtual方法A1,那么A的子类AA才能对Pay进行密封重写,AA的子类不能对A1重写或覆盖。
class A
{
public virtual void A1()
{
MessageBox.Show("A---A1");
}
}
class AA:A
{
public sealed override void A1()
{
MessageBox.Show("AA---A1");
}
}
总结:
Public abstract void pay(); abstract方法没有方法实现,必须继承
Public sealed override void pay(){} sealed方法必须是重写父类的方法
Public static void pay(){} static方法通过类名访问
Public virtual void pay(){} virtual方法子类可以对其override或new
Public new void pay(){} 父类的方法pay不一定是virtual
Public override void pay(){} 父类的方法pay一定要是virtual"