精华内容
下载资源
问答
  • 最近对CLR的本质部分非常兴趣,也看了园子里面很多高手的文章,特别AnyTao同志的[你必须知道的.NET]系列文章。AnyTao同志在继承本质论中,提出了使用关注对象和就近原则的方法来确认继承类具体调用方法的问题。...

        最近对CLR的本质部分非常感兴趣,也看了园子里面很多高手的文章,特别是AnyTao同志的[你必须知道的.NET]系列文章。AnyTao同志在继承本质论中,提出了使用关注对象和就近原则的方法来确认继承类具体调用方法的问题。文章非常精彩,下面的回复更加精彩,对文章进行了必要的补充。

    这篇文章的中,具体集中关注了以下这个问题

    一个被声明为基类(A),却使用派生类(C)进行实例化的对象,其调用的方法(foo,M)到底是基类的,还是派生类的? 

    在回复中,有一个例子很好的说明了这个问题。

     

    ExpandedBlockStart.gif回复中出现的代码片段
    using System;

    class A
    {
    public virtual void Foo()
    {
    Console.WriteLine("Call on A.Foo()");
    }

    public virtual void M()
    {
    Console.WriteLine("Call on A.M()");
    }

    }
    class C : A
    {
    public override void Foo()
    {
    Console.WriteLine("Call on C.Foo()");
    }

    public virtual new void M()
    {
    Console.WriteLine("Call on C.M()");
    }

    }

    class D
    {
    static void Main()
    {

    A c1 = new C();
    c1.Foo();//关注对象

    c1.M();//执行就近

    Console.ReadLine();
    }


    在这个例子中,基类A的方法Foo和M都是虚方法,这些方法可以被(非必须)覆盖。派生类C则覆盖(重写)了基类的Foo方法,同时在重新定义了自己的M方法。(由于使用了New关键字,说明这个方法是C类专有的,向基类隐藏了该方法)。

    作者在文章中,说明了一个类的实例将其TypeHandler指针和一个类型的MethodTable进行了关联(具体和什么类型的MethodTable进行关联,要看New关键字后面的类型名称),这样的话,一个类的实例,在调用具体方法的时候,其实就是到关联的方法表中去查询方法的首地址(具体是可执行代码还是IL,取决于该方法是否被执行过),这个就是关注对象原则。

    此图引用自原文回复中的图


     如果这样的话(根据这张图来看),实例c1应该分别调用C.Foo()和C.M()方法。但是通过就近原则,由于C1在声明的时候是A类型,所以M方法使用了A类的A.M()方法。

    原文中的关注对象原则,说得很好了,但是,就近原则,我没有完全理解。刚才想了一下,其实,如果将上面这个图画得再完整些,可能就可以理解为什么foo和M分别调用基类和派生类的方法了(不需要理解就近原则)。

    在原文的回复的图中,如果不考虑Object对象的方法的话,A类型的MethodTable,没有大的问题,问题是C类型的MethodTable。这个MethodTable有两个问题,其一,在图上只写了一个Foo()和一个M()方法,其实我觉得,M()方法应该写二个才对,其二,没有标明方法是继承于基类的方法,还是派生类本身自己的方法(例如重写的方法和New的方法)。

    重新画了一个图,可能大家能明白我的意思:


    之所以我想这么画图,基于以下理由:

    在生成派生类methodTable的时候,首先会拷贝一张基类的Methodtable,这样的话,一开始C的Methodtable应该和A的一模一样。然后,由于C重写了A的Foo()方法,所以,将C的Methodtable的MethodTable的A.Foo()被替换为C.Foo().然后因为使用了New操作符新建了一个C.M()方法,这个方法理应追加到C的Methodtable里面,而不是替换原来的A.M()方法。

    这样的话,C的Methodtable里面的内容就完整了。

    在调用方法的时候,我们是使用对象的引用来调用方法的,既然是对象的引用,具体调用什么方法,应该考虑到引用的类型。

    这里的c1的引用的类型是A类型,所以检索c1的Methodtable(也就是类型C的Methodtable)时候,它始终要将自己是A类型放在首位来检索,所以它发现两个M方法的时候,就会毫不犹豫的使用方法名称和类型名称都匹配A.M()方法作为检索结果了。当然如果没有两者都匹配的方法,就只能选择一个方法名称一样的方法作为检索结果了C.Foo()。

    如果在声明c1的时候,使用的是C类型,则c1.M()方法将毫无疑问的选择C.M()方法来执行。。。。。

    以上只是个人推断,CLR的事情,太复杂,我也只能靠现象和想象力来解释一些问题了。。。。。

    感谢AnyTao的文章,虽然最近才开始读,但是受益匪浅。。。。。

    本人是C#的初学者,如果文章有什么问题,请大家拍砖指教。

     

    转载于:https://www.cnblogs.com/TextEditor/archive/2010/05/25/1743539.html

    展开全文
  • 理解对象序列化文件格式

    千次阅读 2014-06-02 22:48:46
    对象序列化使用的一种特殊的文件格式来存储对象。...当然,具体的细节过于技术化,所以如果读者对具体的实现不兴趣,完全可以跳过本节的内容。 当对象被存储时,该对象的类也必须同时被存储。类

    对象序列化使用的是一种特殊的文件格式来存储对象。当然,可以使用writeObject/readObject方法而不需要知道在文件中表示对象的具体的字节序列。但是,如果掌握了数据格式对于深入理解对象流处理过程会有很大的帮助。为此,查看保存下来的各种十六进制对象文件。当然,具体的细节过于技术化,所以如果读者对具体的实现不感兴趣,完全可以跳过本节的内容。

    当对象被存储时,该对象的类也必须同时被存储。类的描述包括:

    1)类的名称

    2)唯一的版本序列ID,这是数据域类型和方法签名的指纹

    3)一系列用来对序列化方法加以描述的标志

    4)对数据域的描述


    展开全文
  • 作为一个程序员,首先需要了解的事情我们编写的软件服务的对象是用户,所以我们必须坚持以用户的使用方便程度来评判你写的程序是否完美。当然,没有十全十美的程序,但是只要用户使用方便我们就说这个程序完美...

          作为一个程序员,首先需要了解的是事情是我们编写的软件服务的对象是用户,所以我们必须坚持以用户的使用方便程度来评判你写的程序是否完美。当然,没有十全十美的程序,但是只要用户使用方便我们就说这个程序是完美的。所以,用户才是软件的核心。

          软件的结构是什么,没有具体的解释。但是可以确定的是,软件=程序+软件工程。而程序=数据结构+算法。

          软件是什么?软件就是大量的程序的集合体,从而扩展到一个满足各种功能的应用软件,在扩展到一个能保证维修的软件服务。那程序又是什么,简单的解释,程序就是一行行的代码的集合体,而软件的一个个功能的实现就是这一行行的代码合起来的结果。一个复杂的软件不但要有合理的软件架构,软件设计与实现,还要有各种文件和数据来描述各个程序文件之间的依赖关系,编译参数,链接参数等等。

          软件工程是什么?软件工程就是把系统的,有序的,可量化的方法应用到软件的开发,运营和维护上的过程。软件工程包括下列领域:软件需求分析,软件设计,软件构建,软件测试和软件维护。开发软件时有一个流程,他的目的就是可以提高软件开发,运营,维护的效率,并提高软件的质量,用户的满意度,可靠性和软件的可维护性。

          软件开发具有下面五个难题:

    1.      复杂性。任何一个功能的实现都不是想象的那么简单,往往需要程序员想上好几天甚至几个月,加上大量的实验以及改良浓缩出来的几百行,几万行甚至几百万行代码,随着系统越来越复杂,代码的需求量甚至更多。
    2.      不可见性。由于源代码是封装的,而用户看到的是软件而不是源代码,所以一旦软件出现错误,导致的就是无法判断出程序出现了什么错误。
    3.      易变性。由于用户会提出各种各样的要求,所以程序必须是可变的。
    4.      服从性。软件不能独立存在。他总是要运行在硬件上面,他要服从系统的中其他组成部分的要求,他还要服从用户的要求,行业系统的要求。
    5.      非连续性。许多软件都没有增加输入的特性,有时输入上的很少的变化,回引起输出上的很大的变化。

    关于个人软件开发流程:

          单元测试。单元测试就是解决自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,从而保证模块的质量能得到稳定的,量化的保证。

    创建单元测试的主要步骤:

          1.设置数据

          2.使用被测试类型的功能

          3.比较实际结果和预期的结果

          单元测试需要注意的事项:

          1.必须有最熟悉代码的人来写

          2.单元测试要快

          3.应该覆盖所有代码路径

          4.应该集成到自动测试的框架中

          5.必须和产品代码一起保存和维护

          回归测试。目的是验证新的代码的确改正了缺陷,同时验证新的代码有没有破坏模块的现有功能,有没有Regression。单元测试是回归测试的基础。

    软件工程师的任务清单:

          1.计划,估计这个任务需要多长时间

          2.开发   分析需求,生成设计文档,设计复审,代码规范,具体设计,具体编码,代码复审,测试

          3.记录用时

          4.测试报告

          5.计算工作量

          6.事后总结

          7.提出过程改进计划

    这是我对软件工程的初步体验。

     

    转载于:https://www.cnblogs.com/zll20153246/p/6371556.html

    展开全文
  • 核心工厂的创建, 这样核心类成为一个抽象工厂角色, 仅仅复制工厂子类必须实现的接口, 这样进一步抽象化的好处使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品 与简单工厂可能有点区别的...

    一如既往:原文

    工厂方法(factory method)模式的意义是定义一个创建产品对象的工厂接口, 将实际创建工作推迟到子类当中. 核心工厂的创建, 这样核心类成为一个抽象工厂角色, 仅仅复制工厂子类必须实现的接口, 这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品

    与简单工厂可能有点区别的地方: 那就是抽象工厂的存在 代码例子也很是简单明了

    • 抽象工厂
    • 产品接口 产品实现A 产品实现B
    • 工厂实现类A 用来生成产品A, 工厂实现B, 用了生产产品B
    原文中作者举了个jdbc的类子必看

    简单总结下

    • 时序图看下
      1. 实线-空心菱形箭头 : 聚合关系
      2. 虚线-箭头 : 依赖关系
      3. 虚线-空三角箭头 : 实现关系
      4. 实线-空三角箭头 : 泛化关系, 属于继承关系
      5. 实线-实心菱形箭头 : 组合关系
    • 其中的DriverManager 与Driver 之间的关系
      1. driverManager依赖于driver是由于 静态代码块中loadInitialDrivers这个方法
      2. 同时他们又是聚合的关系, driver在manager中发挥出一些作用

    转载于:https://www.cnblogs.com/denghailei/p/6627458.html

    展开全文
  • 装饰者模式动态地将责任附加上对象上。想要扩展功能,装饰者提供有别于继承的另一种选择,它利用组合和委托在运行时动态地给 组件(被装饰者)加上新的行为,很好的遵循了开放-关闭(对扩展开放,对修改关闭)这...
  • 统计学数据分析必须掌握的基础知识,它通过搜索、整理、分析、描述数据等手段,以达到推断所测对象的本质,甚至预测对象未来的一门综合性科学。统计学用到了大量的数学及其它学科的专业知识,其应用范围几乎覆盖...
  •  穿着职业服装不仅对服务对象的尊重,同时也使着装者有一种职业的自豪、责任敬业、乐业在服饰上的具体表现。规范穿着职业服装的要求整齐、清洁、挺括、大方。 (1)整齐。服装必须合身,袖长至手腕,裤...
  • 知乎上有一段回答[1]: 什么赋范线性空间、内积空间,度量空间,希尔伯特空间 ? 现代数学的一个特点就是以集合为研究对象,这样的...为了能有效地研究集合,必须给集合赋予一些“结构”(从一些具体问题抽象出...
  • 动态加载 FAQ 的过程主要利用 XMLHttpRequest(以下简称 XHR)对象与服务端通信,根据用户单击的兴趣问题动态将内容加载到页面中。在具体实现时,有两点要注意的内容。 1 .对每个问题进行唯一标识FAQ 主要包含...
  • 职场女性的着装礼仪知识 1、职业装 穿着职业服装不仅对服务对象的尊重,同时也使着装者有一种职业的自豪、责任敬业、乐业在服饰上的具体表现。规范穿着职业服装的要求整齐、清洁、挺括、大方。 (1)...
  • Java的产生与流行当今Internet发展的客观要求,Java一门各方面性能都很好的编程语言,它的基本特点简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...
  • 图1.1 实例运行效果1.1.1 技术要点动态加载FAQ的过程主要利用XMLHttpRequest(以下简称XHR)对象与服务端通信,根据用户单击的兴趣问题动态将内容加载到页面中。在具体实现时,有两点要注意的内容。1.对每个...
  • 该方法一个回调函数,包含有应用处理事件的具体代码,由应用程序开发者实现。  于是,应用开发者必须做好以下工作:  (1)创建事件处理器对象,以便将来能处理它所兴趣的事件;  (2)向
  • 它的 <code>value</code> 则「函数储存对象」的同名方法接受 (state[key], action)</code> 参数的返回值。 <pre><code> javascript var reducers = { todos: (state, action) { //预期此处的 state 参数...
  • 一、定义(概念) 允许一个对象在其内部状态改变的时候改变其行为。 看上去就像改变了它的类一样。... ● 环境(Context)角色,也成上下文:定义客户端所兴趣的接口,并且保留一个具体
  • 具体的细节不再详解,大家如果兴趣的话,把这些方法一个一个地都看一遍吧,相信对于你理解 Laravel 运行原理很有帮助。其实 PHP 跟字符串结合的紧密程度已经紧逼 js 和 JSON 了。结尾分享一个小...
  • C语言接口与实现:创建可重用软件的技术.pdf

    千次下载 热门讨论 2011-09-30 17:46:11
     ——norman ramsey,贝尔实验室研究员 每一位程序员和软件项目经理必须掌握创建可重用软件模块的技术:可重用软件模块 构建大规模、可靠应用的基石。与当前某些面向对象语言不同,c语言为创建可重用应用程 序...
  • 在职场上,穿着打扮显示出个人的风采精神,合适着装会给你带来意想不到的效果,穿着职业服装不仅对服务对象的尊重,同时也使着装者有一种职业的自豪、责任敬业、乐业在服饰上的具体表现。规范穿着职业服装...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    用来建模对象是如何改变其状态以响应事件,展示对象从创建到删除的生命周期 状态图 状态标记符 状态图 实例:打电话 状态图 状态和转移 事件 状态图 如果你太喜欢 状态图 详细状态 状态图 子状态 状态图...
  • 希尔伯特空间

    2019-06-11 17:03:57
    什么赋范线性空间、内积空间,度量空间,希尔伯特空间 ? 现代数学的一个特点就是以...为了能有效地研究集合,必须给集合赋予一些“结构”(从一些具体问题抽象出来的结构)。 从数学的本质来看,最基本的集合有...
  • 正如许多人或多或少正确地指出了引用和原始类型什么一样,人们可能会对我们在Java中拥有更多相关的类型兴趣。 这java中类型的完整列表...Integer注意:基本类型和引用类型之间的差异使得必须依靠装箱转换对象...
  • 我们常说开展思想工作要“动之以情”,个别谈话也这样,需要用尊重、关心、爱护谈话对象的深厚感情去吸引人、感染人、打动人。 有情,说领导者要有“爱人之心”,对自己的下属有深厚的感情。感情本身就是一种...
  • 本篇为《信号处理》系列博客的第四篇,该系列博客主要记录信号处理相关知识的学习过程和自己的理解,方便以后查阅。...为了能有效地研究集合,必须给集合赋予一些“结构”(从一些具体问题抽象出来的结构)。
  • 在这一方面主要按以下几点开展工作:(需要和客服部合作展开,具体负责人:魏鉴明) 1.根据客户回厂次数、客户的品质作为客户的忠诚度的评价指标,找出我们的忠诚客户,作为我们的重点维护对象; 2.通过对流失客户...

空空如也

空空如也

1 2 3 4
收藏数 73
精华内容 29
关键字:

对象感必须是具体的