.net继承

来源:互联网 发布:淘宝主播排名榜在哪看 编辑:程序博客网 时间:2024/06/05 06:16

 读了《你必须知道的.net》的关于继承的本质篇,有以下收获:
1.子类继承父类,那么在创建子对象(为子对象分配内存)的时候,会有以下几点要注意的
  (1)如果子类存在"相同"的字段成员或函数成员,且函数不存在覆写(override),那么子

对象中将同时存在父类和子类的"相同"成员,只不过父类的成员被隐藏了.(这里的"相同"

是指:如果字段则类型相同,名字相同;如果函数则返回值类型相同,名字相同,参数相同)
要调用隐藏的成员必须要父类型的引用.
  (2)创建子类型对象的过程,先创建字段,从最上层的父类开始,直到自身的字段,如果遇

相同的字段,则隐藏掉(隐藏并不代表不创建,只是调用它需要不同的权限,比如父类型指

针);成员函数的创建有所不同,子对象中保存一个指针,它指向另外一块保存了方法表的

内存块,如果函数被覆写(override),那么只有一个备份,如果是隐藏,则有多个备份,只不

过各个备份的访问权限不一样.

3.例子:
 class Base
    {
        public string str = "baseString";

        public string str2 = "baseString2";

        public void function1()
        {
            Console.WriteLine("base function1");
        }

        public virtual void function2()
        {
            Console.WriteLine("base function2");
        }
    }

    class Derived : Base
    {
        public new string str = "derivedString";


        public new void function1()
        {
            Console.WriteLine("derived function1");
        }

        public override void function2()
        {
            Console.WriteLine("derived function2");
        }
    }

 static void Main(string[] args)
        {
            Derived d = new Derived();
            Base b = new Derived();

            //验证字段被隐藏
            Console.WriteLine("隐藏字段测试:");
            Console.WriteLine(d.str);
            Console.WriteLine(b.str);
            Console.WriteLine();

            //验证函数被隐藏
            Console.WriteLine("隐藏函数测试:");
            d.function1();
            b.function1();
            Console.WriteLine();

            //验证函数被覆写
            Console.WriteLine("函数覆写测试:");
            d.function2();
            b.function2();
        }

 

结果如下:

 

隐藏字段测试:

derivedString

baseString

 

隐藏函数测试:

derived function1

base function1

 

覆写函数测试:

derived function2

base function2

 

原创粉丝点击