标签:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class A { //调用到这个构造函数时:x=1,y=0 public A() { //该函数在B类中被重载,因此输出 x=1,y=0 Console.WriteLine("在A类的构造函数中"); PrintFields(); } public virtual void PrintFields() { } } class B : A { //派生类变量/静态成员的执行顺序优于基类 //先变量,因此,x=1,y=0 int x = 1; int y; //后构造函数,此时,先调用基类构造函数 public B() { //运行到这里时,A类构造函数已经执行完毕 y = -1; Console.WriteLine("在B类的构造函数中"); //此时 x=1,y=-1 PrintFields(); } public override void PrintFields() { Console.WriteLine("x={0},y={1}", x, y); } } class Program { static void Main(string[] args) { A a = new B(); Console.ReadLine(); } } }
1.B继承A,请问a是A的实例还是B的实例啊?
答:B的实例
2.对象a可以调用A类中的方法吗?可以调用B的方法吗?
答:不一定,如果是虚拟方法,并且在B类重载了A的虚拟方法,a将会调用B的同名方法,普通方法会调用A的方法,
举例:
class A
{
public void MethodA(){...}
public virtual void MethodB(){...}
}
class A:B
{
public new void MethodA(){...}
public override void MethodB(){...}
}
其中,B类重写了A类的普通方法MethodA,也重写了A类的虚拟方法MethodB,则:
A a = new B();
a.MethodA();// 将会调用A类的MethodA方法
a.MethodB();// 将会调用B类的MethodB方法
// 补充:
为什么要把它的类型定义成A呢?这样做有什么好处?
答:A是基类,B是A的扩展,像B这样的扩展类可以很多很多的,如(B1,B2,B3......),扩展类是不可预见的,也需你在编写程序的时候还没有B2这个扩展类,你又怎么能调用B2 b = new B2()来创建B2的对象呢?你只有用A a;的方法定义一个引用,然后把B2传给a对象,
标签:
原文地址:http://www.cnblogs.com/whyareyousocool/p/4332277.html