override :
(1)方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的基方法必须与 override 方法具有相同的签名
(2)不能重写非虚方法或静态方法。重写的基方法必须是 virtual、 abstract 或 override 的。
(3)override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的 访问级别修饰符。
(4)重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、 abstract 或 override 的。
(5)您不能使用 new、 static 或 virtual 修饰符来修改 override 方法。
new :
(1)在用作修饰符时, new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本
不同点:
new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。
override 修饰符会扩展继承成员的实现
下面是一个简单的测试
class BaseClass
{
public virtual void Show()
{
Console.WriteLine("我来自基类show方法");
}
public void Print()
{
Console.WriteLine("我来自基类Print方法");
}
}
class DerivedClass:BaseClass
{
public override void Show()
{
Console.WriteLine("我来自继承类show方法");
}
public new void Print()
{
Console.WriteLine("我来自继承类Print方法");
}
}
static void Main()
{
DerivedClass dClass = new DerivedClass(); dClass.Show();
dClass.Print();
//将父类指向了子类
BaseClass baseClass2 = new DerivedClass();
baseClass2.Show();
baseClass2.Print();
程序输出结果:
/*
我来自继承类show方法
我来自继承类Print方法
我来自继承类show方法
我来自基类Print方法
*/
}
结论:从以上可以看出,
使用new修饰符,基类的方法Print并没有消失而是隐藏,在将父类指向子类时,父类并没有运行子类的Print方法,而是执行了自己的方法。
使用override扩展了基类的方法,在将父类指向子类时,父类并执行了子类的Show方法,重写了父类Show方法
|