<1>.Net中当子类被请求时,会先实例化父类。先建立父类的字段,然后是构造函数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace list
{
class A
{
}
class B : A
{
public A MyMthod()
{
//你想想看这个MyMthod()方法的返回值类型明明是A类型,为什么这里返回一个B类型对象也不报错呢?
return new B(); //因为B类型是A类型的子类,子类对象可以隐式的转换成父类对象。这里已经将B类型隐式的转换成A类型并将它返回了。所以它不会报错。
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
B b = new B();
a = b; //子类对象可以赋值父类对象
//b = a; //父类对象不可以赋值给子类对象
b = (B)a;
//举个例子:假如父类是 “人” 它有两个子类,一个“中国人”类,一个“美国人”类
//也就是说 new一个中国人的对象“李小龙” new一个美国人的对象“奥巴马”
// new 一个 “人"的对象 "人1"
//子类对象“李小龙”,“奥巴马”肯定是可以赋值给“人”这个父类对象人1的。因为“人1”可以是中国人,也可以是美国人,只要是人就可以了。这里你给我一个“李小龙”,或者“奥巴马”肯定是可以的。
//而父类对象 “人1”赋值给子类对象“李小龙”或者子类对象“奥巴马”就不可以了。
//因为“李小龙”是中国人类型 ,中国人类型就只能接收中国人类型,所以当你把一个“人”类型对象赋值给“中国人”类型对象的时候,就出错了。我管你要一个中国人,你给我一个人1。我怎么知道你这个“人1”是不是中国人呢?你也可能是美国人,也可能是德国人。对吧。
//除非 你给我指定说,这个人一定是一个中国人。“李小龙”=(中国人)“人1”
}
}
}