坚持 成长 每日一篇
这里主要讲的是C#中重写方法主要用的关键字分别代表的意义
virtual,abstract是告诉其它想继承于他的类 你必须通过override来重写我的这个方法或属性,否则会有警告。
Virtua:当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。
abstract:表示声明的方法为抽象方法。具体使用参考http://blog.csdn.net/u014410695/article/details/48265209
override:是重写(有的翻译为覆盖),重写的是函数签名相同的方法(函数名相同,函数参数,返回类型相同),重载是同名的方法。
new:是则是新建一个与父类同名的方法,并没有发生覆盖,当以父类的类型引用子类实例时候,会调用父类的方法,而不是new出来的方法。
重写注意事项
1.不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。
2.override修饰的方法也是可以重写的,因为基类中的 override 实际上是对基类的基类进行的重写,由于继承可传递,所以也可以对基类中 override 的方法进行重写。
3.override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
4.不能使用修饰符 new、static、virtual 或 abstract 来修饰 override 方法。
5.重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
using System;
namespace C中Abstract和Virtual
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Hello World!");
//无论是virtual还是new都能实现修改父类方法
Animals animals = new Animals ();
animals.Speack ();
animals.Run ();
Human human = new Human ();
human.Speack ();
human.Run ();
//new 和override修饰方法时候的区别
Animals animalsA = new Human();
animalsA.Speack();//这里的speak调用的是Human的,而不是Animals的,此时Human实例重载了Animals的Speak方法,父类的Speack已经不存在了。
animalsA.Run();//这里的run调用的是父类的方法,因为父类的方法没有被覆盖,指针的类型又是父类指针
Human humanA = (Human)animalsA; //当恢复变量类型一切调用又恢复正常了。
humanA.Speack();
humanA.Run ();
}
}
//abstract 和 virtural 区别
class Animals
{
public virtual void Speack(){
Console.WriteLine ("我是Animals 我说话");
}
public void Run(){
Console.WriteLine ("我是Animals 我在奔跑");
}
public virtual void Smile(){
Console.WriteLine ("我是Animals 我在Smile");
}
}
class Human:Animals
{
public override void Speack(){
Console.WriteLine ("我是Human 我说话");
}
public new void Run(){
Console.WriteLine ("我是Human 我在奔跑");
}
}
}