要理解面向对象,就得理解多态,多态确实难理解,工作了两年了,才理解一点点。
下面就C#中的几个易搞错的关键字和各位网友一分享下,请看如下代码:
static void Main(string[] args)
{
root obj1 = new node1();
obj1.run();
root obj2 = new node2();
obj2.run();
System.Console.WriteLine("----------------------");
root obj3 = new node1();
obj3.RunBase();
root obj4 = new node2();
obj4.RunBase();
System.Console.WriteLine("----------------------");
root obj5 = new node1();
obj5.AbRun();
root obj6 = new node2();
obj6.AbRun();
System.Console.WriteLine("----------------------");
node1 obj11 = new node1();
obj11.run();
node2 obj12 = new node2();
obj12.run();
System.Console.WriteLine("----------------------");
node1 obj13 = new node1();
obj13.RunBase();
node2 obj14 = new node2();
obj14.RunBase();
System.Console.WriteLine("----------------------");
node1 obj15 = new node1();
obj15.AbRun();
node2 obj16 = new node2();
obj16.AbRun();
}
}
public abstract class root
{
public root()
{
}
public virtual void run()
{
System.Console.WriteLine("这是基类中的方法");
}
public abstract void AbRun();
public virtual void RunBase()
{
System.Console.WriteLine("调用了基类的RunBase方法");
}
}
public class node1 : root
{
public node1()
{
}
public override void run()
{
System.Console.WriteLine("这是子类1中的方法");
}
public override void RunBase()
{
base.RunBase();
System.Console.WriteLine("调用了子类1中的Runbase方法");
}
public override void AbRun()
{
System.Console.WriteLine("调用了子类1中的AbRun方法");
}
}
public class node2:root
{
public node2()
{
}
public new void run()
{
System.Console.WriteLine("这是子类2中的方法");
}
public new void RunBase()
{
base.RunBase();
System.Console.WriteLine("调用了子类1中的Runbase方法");
}
public override void AbRun()
{
System.Console.WriteLine("调用了子类2中的AbRun方法");
}
}
运行结果如下
这是子类1中的方法
这是基类中的方法
----------------------
调用了基类的RunBase方法
调用了子类1中的Runbase方法
调用了基类的RunBase方法
----------------------
调用了子类1中的AbRun方法
调用了子类2中的AbRun方法
----------------------
这是子类1中的方法
这是子类2中的方法
----------------------
调用了基类的RunBase方法
调用了子类1中的Runbase方法
调用了基类的RunBase方法
调用了子类1中的Runbase方法
----------------------
调用了子类1中的AbRun方法
调用了子类2中的AbRun方法
请按任意键继续. . .
解释如下
1: Override 主要用来对基类的抽象方法和虚方法进行重写,方法必须是virtual abstract override修释的才可以重写
New 关键字主要用来定义一个与基类同名的新方法,区别派生类和基类同名方法的选择问题,通过隐藏基类方法,到使编译器调用正确的方法的目的.
2: abstract方法只能被override 不能被new,并且在子类中必须被重写
3: virtual方法可以override又可以new,子类中可以重写,也可以隐藏