惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
小众软件
小众软件
J
Java Code Geeks
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
L
LangChain Blog
博客园 - 司徒正美
量子位
Y
Y Combinator Blog
C
Check Point Blog
T
Tailwind CSS Blog
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
V
V2EX
阮一峰的网络日志
阮一峰的网络日志

博客园 - yinmz

mysql内置函数 mysql表结构随笔 C#的显式接口和隐式接口 设计模式依赖的软件设计原则 UML类图 [导入]《交互设计之路——让高科技产品回归人性》读书笔记(八) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(七) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(五) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(四) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(三) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(二) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(一) [导入]伍迷创意随想集 之 银行排队系统的改良 [导入]伍迷创意随想集 之 爱情博物馆 [导入]伍迷创意随想集 [导入]伍迷创意随想集 之 聚众广告创精品 [导入]一个通过Flash设计与Flex结合开发的网站www.mapgle.cn [导入]岁月凶残,敬请珍惜——得知早已不能过五四节时之随想 [导入]《交互设计之路——让高科技产品回归人性》读书笔记(六) [导入]《交互设计之路——让高科技产品回归人性》读书笔记(九) [导入]《大话设计模式》重印公告 [导入]伍迷随想冷饭集 [导入]伍迷之子满月时之随想 [导入]关于阅读技术类图书的思考 [导入]《大话设计模式》第三次印刷公告
读 你必须知道的.NET有感
yinmz · 2009-07-10 · via 博客园 - yinmz

      最近正在 看你必须知道的.NET这本书,下面是在看书过程中,记载的自己的一些感受和书中没有看到的,记下来供自己以后翻看:

07-10

      page23 1.2章节 继承

      ok,首先我们需要有对象定义,也就是class定义,根据书中的例子我们写出下面3个类的代码

      public abstract class Animal
      {
              public abstract void ShowType();
              public void Eat()
              {
                  Console.WriteLine("Animal always eat!");
              }
      }          

      public class Bird:Animal  
    {
        private string color;
        public string Color
        {
            get { return color; }
            set { color = value; }
        }
        private string type = "Bird";
        public string Type
        {
            get { return type; }
        }
        public override void ShowType()
        {
            Console.WriteLine("Type is {0}", type);
        }
    }

public class Chicken:Bird
    {
        private string type = "Chicken";

        public new string Type
        {
            get { return type; }
        }
 
        public override void ShowType()
        {
            Console.WriteLine("Type is {0}", type);
        }

        public void ShowColor()
        {
            Console.WriteLine("Color is {0}", Color);
        }
    }

      当我们只是声明一个对象变量的时候:Bird bird ;仅仅是一个引用(指针),保存在线程的堆栈上,占用4Byte的内存空间,将用于保存Bird对象的有效地址,此时bird未指向任何有效的实例。

      创建新对象 bird=new Bird();要说的主要在这里,通过F11进入Bird类内部会发现,程序对类内部的字段初始化,然后执行构造函数,这里private string color;只是声明变量没有赋值 ,设置断点不会执行到该语句,如果private string color = string.Empty;就会执行到这里

然后是书中重点提到的内容:

声明并创建两个对象:Bird bird2 = new Chicken();
            Chicken chicken = new Chicken();

这时候bird2的字段或者属性读取的是Bird类的值,而方法是执行的Chicken的方法

书中的解释是:bird2对象和chicken对象在内存布局上是一样的,差别在于其引用指针的类型不同:brid2为Bird类型指针,而chicken为Chicken类型指针。以方法调用为例,不同的类型指针在虚拟方法表中有不同的附加信息作为标志来区别其访问的地址区域,称为offset。不用类型的指针只能在其特定的地址区域内执行,子类覆盖父类时会保证其访问地址区域的一致性,从而解决了不同的类型访问具有不同的访问权限问题。

执行就近原则:对于同名字段或者方法,编译器是按照其顺序查找来引用的,首先访问离他最近的字段或者方法,如上Type,这也就是为什么在对象创建时必须将字段按顺序排列,而父类要先于子类编译的原因了。