类的继承详解一
namespace cSharpJichu
{
class BaseClass
{
private string a = string.Empty;
public void RunAtBaseClassA()
{
Console.WriteLine("RunAtBaseClassA");
}
public virtual void RunAtBaseClassVirtual()
{
Console.WriteLine("RunAtBaseClassVirtualA");
}
}
class SonClass : BaseClass
{
private string a = string.Empty;
public new void RunAtBaseClassA()
{
Console.WriteLine("SonClass");
}
public override void RunAtBaseClassVirtual()
{
Console.WriteLine("RunAtSonClassOverride");
}
}
class ExtendClass
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
bc.RunAtBaseClassA();
bc.RunAtBaseClassVirtual();
Console.WriteLine();
SonClass sc = new SonClass();
sc.RunAtBaseClassA();
sc.RunAtBaseClassVirtual();
Console.WriteLine();
BaseClass bc2 = new SonClass();
bc2.RunAtBaseClassA();
bc2.RunAtBaseClassVirtual();
Console.Write("------------------ 以上是类的继承测试 ------------------------");
Console.Read();
}
}
}
运行结果:
这里重点说一下:
BaseClass bc2 = new SonClass();//父类的对象指向子类的引用 [这是多态的一种表现形式]
bc2.RunAtBaseClassA();//调用父类本身的RunAtBaseClassA方法
bc2.RunAtBaseClassVirtual(); //调用了子类里重写父类的RunAtBaseClassVirtual()方法
bc2.RunAtBaseClassVirtual();
问题1:这一句为什么不是调用父类的RunAtBaseClassVirtual()方法,而是调用了子类的RunAtBaseClassVirtual()方法?
答:是因为子类重写了父类的RunAtBaseClassVirtual()方法.
问题2:如果子类没有重写父类的RunAtBaseClassVirtual()方法,那么将调用父类的RunAtBaseClassVirtual()方法
下面就修改一个代码,以测试上面的问题2
using System;
namespace cSharpJichu
{
class BaseClass
{
private string a = string.Empty;
public void RunAtBaseClassA()
{
Console.WriteLine("RunAtBaseClassA");
}
public virtual void RunAtBaseClassVirtual()
{
Console.WriteLine("RunAtBaseClassVirtualA");
}
}
class SonClass : BaseClass
{
private string a = string.Empty;
public new void RunAtBaseClassA()
{
Console.WriteLine("SonClass");
}
public void RunAtBaseClassVirtual()
{
Console.WriteLine("RunAtSonClassOverride");
}
}
class ExtendClass
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
bc.RunAtBaseClassA();
bc.RunAtBaseClassVirtual();
Console.WriteLine();
SonClass sc = new SonClass();
sc.RunAtBaseClassA();
sc.RunAtBaseClassVirtual();
Console.WriteLine();
BaseClass bc2 = new SonClass();
bc2.RunAtBaseClassA();
bc2.RunAtBaseClassVirtual();
Console.Write("------------------ 以上是类的继承测试 ------------------------");
Console.Read();
}
}
}
问题2 的运行结果:
下面的这个结果,也就是问题2的答案:
看到这里,很多初学的朋友们,就会奇怪了.为什么会有那样的现象?
答案:
BaseClass bc = new BaseClass();
bc.RunAtBaseClassA();
bc.RunAtBaseClassVirtual();
Console.WriteLine();
SonClass sc = new SonClass();
sc.RunAtBaseClassA();
sc.RunAtBaseClassVirtual();
Console.WriteLine();
BaseClass bc2 = new SonClass();
bc2.RunAtBaseClassA();
bc2.RunAtBaseClassVirtual();
在这里教一个土方法,只要看对象的类型就可以:
BaseClass bc = new BaseClass();
SonClass sc = new SonClass();
这两句代码就不用说了.bc对象和sc对象当然是调用各自类里的相应方法
BaseClass bc2 = new SonClass();
虽然bc2是指向子类的引用,
如果子类没有重写父类的方法[RunAtBaseClassVirtual()],调用的仍然是父类自己的RunAtBaseClassVirtual()方法.
如果子类重写了父类的方法[RunAtBaseClassVirtual()],调用的则是子类自己的RunAtBaseClassVirtual()方法.