这一次,让我们搞一些破坏性实验,来验证上两次的内容
第一个破坏性实验,module里定义self.xxx方法
ruby 代码
- irb(main):001:0> module M
- irb(main):002:1> def self.method_with_self
- irb(main):003:2> end
- irb(main):004:1> end
- => nil
- irb(main):005:0> class A
- irb(main):006:1> include M
- irb(main):007:1> end
- => A
- irb(main):008:0> A.methods - Class.methods
- => []
让我仔细看看,我们定义的方法呢?
ruby 代码
- irb(main):009:0> M.singleton_methods
- => ["method_with_self"]
好了,上面是include,那么,extend会发生什么情况呢?
ruby 代码
- irb(main):010:0> class B
- irb(main):011:1> end
- => nil
- irb(main):012:0> B.extend M
- => B
- irb(main):013:0> B.ancestors
- => [B, Object, Kernel]
ok,再来让我们看看B的单例类此时发生了什么变化
ruby 代码
- irb(main):014:0> singleton_class_of_b = class<<B;self;end
- =>
- irb(main):015:0> singleton_class_of_b.ancestors
- => [M, Class, Module, Object, Kernel]
正如预料的,M变成了B单例类的直接父类,M中定义的实例方法,变成了B的类方法(因为M中的实例方法被B的单件类继承,变成了单件类的实例方法,也就是B的类方法),M中定义的以self开头的类方法呢?当然仍然在M的单件类里面啦,它是不会随着M插入点的变化而变化的。
第二个破坏性实验,单件类中的self.xxx方法?
ruby 代码
- irb(main):001:0> class A
- irb(main):002:1> end
- => nil
- irb(main):003:0> class<<A
- irb(main):004:1> def self.method_defined_in_singleton_class_of_a
- irb(main):005:2> end
- irb(main):006:1> end
- => nil
- irb(main):007:0> A.singleton_methods
- => []
- irb(main):008:0> singleton_class_of_a = class<<A;self;end
- =>
- irb(main):009:0> singleton_class_of_a.singleton_methods
- => ["method_defined_in_singleton_class_of_a", "new", "nesting"]
-
看了上面代码后想想其实很自然,我们之前说过“所有的类方法都是放在这个类对象的单例类中”,所以,我们新建的这个方法method_defined_in_singleton_class_of_a实际上是放到了A的singleton class <A>的singleton class<A<A>>中的。
第三个破坏性实验,找不到直接父类M?
ruby 代码
- irb(main):001:0> module M
- irb(main):002:1> def self.class_method_defined_in_m
- irb(main):003:2> puts "singleton method in m"
- irb(main):004:2> end
- irb(main):005:1> end
- => nil
- irb(main):006:0> class A
- irb(main):007:1> include M
- irb(main):008:1> end
- => A
- irb(main):009:0> A.ancestors
- => [A, M, Object, Kernel]
- irb(main):010:0> A.superclass
- => Object
上面irb结果可以看到,从继承树上来看A的直接父类是M,但是当我们调用A.superclass的时候却跳过了这个M,为什么呢?正如之前所说,我们在继承树上看到的M,其实只是M的一个代理,他的作用仅仅是用来做方法查找,让A变成一个代理类的子类,是没有意义的,所以,虽然实际上A确实称为了代理类的子类,但是从逻辑上讲,它的继承关系并没有被改变,它从逻辑上仍然是Object的直接子类
分享到:
相关推荐
原文地址:[Object-C语言随笔之三] 类的创建和实例化以及函数的添加和调用!http://blog.csdn.net/xiaominghimi/archive/2011/06/30/6577412.aspx
使用简单的方法实现类似京东商品三级分类、没有加特效和动画。
Python中至少有三种比较常见的方法类型,即实例方法,类方法、静态方法。它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文。 首先,这三种方法都定义在类中。下面我先简单说一下怎么定义和调用...
要求每个类都含有计算该图形的周长的成员方法和计算的面积的成员方法。然后编写一个程序,分别创建这些类的实例对像,并输出这些实例对像的周长和面积。在创建这些实例对象时,构造方法的调用参数值可以自行设计!
Python中至少有三种比较常见的方法类型,即实例方法,类方法、静态方法。它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文。 首先,这三种方法都定义在类中。下面我先简单说一下怎么定义和调用...
ython 类语法中有三种方法,实例方法,静态方法,类方法。 ps.python中self,cls的区别 普通实例方法,第一个参数需要是self,它表示一个具体的实例本身。 如果用了staticmethod,那么就可以无视这个self,而将这...
1.将点-圆-圆柱的继承关系用类表示...创建Point类、Circle类和Cylinder类 创建使用该三个类的主类。 注意:每个类至少有两个构造函数和三个方法。 2目的:建立类的层次结构。 创建如下图所示的类 使用类层次结构中的类
实例124 使用分部类实现多种计算方法 153 实例125 使用分部类记录学生信息 155 5.5 泛型的使用 156 实例126 使用泛型存储不同类型的数据列表 156 实例127 通过泛型查找不同数组中的值 158 实例128 通过继承泛型类...
用java语言编写,实现了一个student类,定义了三个属性,并写了set和get 方法,最后用数组实例化这个类。
(2)使用IOC容器实例化上述类,并对属性使用构造方法注入,然后测试。 (3)模拟三层体系结构,为其创建对应的departmentDao、departmentService、departmentController;实现对部门项目的查询、添加和修改。
cs代码-1.仿圆类创建长方形类(Rectangle,包括长width和宽 height)和三角 形类(Triangle,包括边长:a...3.创建测试类(Test),在测试类Main方法中实例化圆、长方形、三角形,并计算和显示这些几何形状的面积和周长。
定义使用三、类方法1. 概念简介2. 定义使用四、静态方法1. 概念简介2. 定义使用五、方法综合案例1. 案例需求2. 代码实现五、参考资料 一、实例 使用面向对象方式进行程序开发,首先是设计类; 其次是使用**类名()**...
设计一个Personal类: (1)该类有实例变量(属性)name、age、sex; (2)一个无参构造函数和一个有参构造函数;...(3)一组用于访问实例变量的set/get方法。 再设计一个测试类TestPersonal,测试该类。
C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为...C#委托中好比是律师,真真诉说案情的是当事人(真真被调用的是实例方法InstanceMethod)
抽象类与抽象方法由abstract修饰 abstract的使用注意 抽象方法没有方法体 抽象成员只能存在于抽象类中 抽象类可以有非抽象成员(侧重族群的概念) 抽象类的子类必须实现抽象方法体 抽象类you构造函数 抽象类只能...
Python类的动态修改的实例方法 相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不满足需求的方法。比如说下面这个例子。 class Dog: def bark(self):...
实验目的1、掌握类定义的方式,掌握如何在类中定义成员变量和成员方法。 2、掌握如何创建类的对象,掌握如何使用两个或者多个变量引用同一个实例对象。3、了解为什么要对类进行封装,了解如何实现类的封装。4、掌握...
C#工厂方法的实例,如何利用接口和类. 下例代码给出了一个实现鳄梨供货示例的简单程序。每一个出产鳄梨的国家都对应一个类,它们都实现了IProduct接口,从而可以向采购员提供鳄梨。根据不同的月份,FactoryMethod将...
JavaScript继承的三种方法实例 继承 继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。 继承也是为了数据共享,js中的继承也是为了实现...
《VFP编程实例及提高:通向编程实战之路》共三章,第一章面向对象编程基础,介绍面向对象程序设计的基本理念和基本概念,包括类、对象、对象的属性、对象的事件和事件发生的顺序等内容。第二章介绍了VFP实训案例,在...