定义 S4 泛型函数
在前面的例子中,我们可以看出 S4 比 S3 更正式,因为 S4 类有类的正式定义。同样,
S4 的泛型函数也更加正式。
在一个关于形状的例子中,我们定义了一系列具有继承关系的 S4 类,只是继承关系的层级
结构比较简单。首先,Shape 是处于根节点的类,Polygon 和 Circle 都继承自 Shape,而
Triangle 和Rectangle 继承自Polygon。这些形状的继承结构如图10-5 所示。

图 10-5
除了 Shape 类,其他每个类都有一些用于描述这个类必要的字段:
setClass("Shape")
setClass("Polygon",
representation(sides = "integer"),
contains = "Shape")
setClass("Triangle",
representation(a = "numeric", b = "numeric", c = "numeric"),
prototype(a = 1, b = 1, c = 1, sides = 3L),
contains = "Polygon")
setClass("Rectangle",
representation(a = "numeric", b = "numeric"),
prototype(a = 1, b = 1, sides = 4L),
contains = "Polygon")
setClass("Circle",
representation(r = "numeric"),
prototype(r = 1, sides = Inf),
contains = "Shape")
定义了这些类,我们就可以构建一个泛型函数来计算一个 Shape 对象的面积。为此,
我们需要调用 setGeneric( )创建一个新的泛型函数:area( ),并为 area( )提供
一个调用 standardGeneric("area")的函数来使这个新的泛型函数可用于 S4 方法分
派。参数 valueClass 是用来确保每种方法的返回值必须是 numeric 类:
setGeneric("area", function(object) {
standardGeneric("area")
}, valueClass = "numeric")
## [1] "area"
一旦构建了泛型函数,我们就可以为不同种类的形状实现不同的方法。对于 Triangle,
给定三角形的 3 个边长,使用海伦公式[Heron's formula(https://en.wikipedia.org/wiki/Heron's_
formula)]来计算它的面积:
setMethod("area", signature("Triangle"), function(object) {
a <- object@a
b <- object@b
c <- object@c
s <- (a + b + c) / 2
sqrt(s * (s -a) *(s -b) * (s -c))
})
## [1] "area"
对于 Rectangle 和 Circle,我们可以很容易地写出它们的面积公式:
setMethod("area", signature("Rectangle"), function(object) {
object@a *object@b
})
## [1] "area"
setMethod("area", signature("Circle"), function(object) {
pi *object@r ^2
})
## [1] "area"
现在,我们创建一个 Triangle 类的对象实例,并查看泛型函数 area( )是否会分
派正确的方法,然后返回正确的答案:
triangle <- new("Triangle", a = 3, b = 4, c = 5)
area(triangle)
## [1] 6
再创建一个 Circle 类对象实例,看看方法分派是否正常进行:
circle <- new("Circle", r = 3)
area(circle)
## [1] 28.27433
两个答案都是正确的。泛型函数 area( )的工作方式与 S3 的泛型函数类似,都是根
据输入对象的类执行方法分派。
定义 S4 泛型函数的更多相关文章
- 排序算法 2  qsort 库函数,泛型函数
		
_____谈谈排序算法 交换排序——>冒泡排序-->快速排序 选择排序——>简单选择排序——>堆排序 插入排序——>直接插入排序——>希尔排序 _____排序算法对 ...
 - Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用
		
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
 - Swift泛型和泛型函数
		
泛型(generic)可以使我们在程序代码中定义一些可变的部分,在运行的时候指定.使用泛型可以最大限度地重用代码.保护类型的安全以及提高性能.在Swift集合类中,已经采用了泛型.一.一个问题的思考怎 ...
 - Java泛型函数的运行时类型检查的问题
		
在一个数据持久化处理中定义了数据保存和读取的 泛型函数的,但是在运行时出现类型转换错误,类型不匹配,出错的位置不是load方法,而是在调用load方法之后,得到了列表数据,对列表数据进行使用时出现的. ...
 - 定义 S4 类
		
S3 类仅用一个字符向量表示,与之不同的是,S4 类要求对类和方法有正式定义.为了定义一个 S4 类,我们需要调用 setClass( ),并提供一种类成员的表示,这种表示被称为字段(slots).通 ...
 - 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数
		
 1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...
 - kotlin之函数的范围和泛型函数
		
kotlin 中函数可以定义为局部函数,成员函数以及扩展函数 局部函数:就是嵌套在函数内的函数 成员函数就是定义在类或者对象之内的函数 泛型函数就是函数可以带有泛型参数,可通过尖括号来指定
 - Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数
		
11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...
 - C++中为什么要将析构函数定义成虚函数
		
构造函数不可以是虚函数的,这个很显然,毕竟虚函数都对应一个虚函数表,虚函数表是存在对象内存空间的,如果构造函数是虚的,就需要一个虚函数表来调用,但是类还没实例化没有内存空间就没有虚函数表,这根本就是个 ...
 
随机推荐
- iOS - 开发中调试小技巧
			
对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...
 - maven学习(二)(转)
			
一.maven父工程与子模块的拆分与聚合原理 问题描述:将ssh工程拆分为多个模块开发 1.1.拆分原理 创建一个maven project(pom),然后在创建三个子模块(maven moudule ...
 - 【node】----mocha单元测试框架-----【巷子】
			
1.mocha简介 单元测试是用来对一个模块.一个函数.或者一个类来进行正确性的检测工作 特点: 既可以测试简单的JavaScript函数,又可以测试异步代码, 可以 ...
 - Spring.Net的使用
			
1.Spring.Net的简单介绍 spring.net 框架是微软效仿java中的spring框架而推出的一种在.net中使用的框架,它使用配置的方式实现逻辑的解耦,它的主要功能集成在Spring. ...
 - SQL---->mySQl数据库1------jdbc简单入门
			
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 目的:不用学习每个数据库的驱动,学 ...
 - curl命令踩的坑
			
使用curl命令执行get请求,带多个参数: curl localhost:/user/binding/query?userId=&wrapperId=&from=test [] [] ...
 - Python开发【Django】:CMDB基础
			
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
 - shell export 命令
			
export 命令作用是 把变量导出 也可以用export来定义环境变量 导入 定义的变量 这样的话类似于python面向对象的self.变量 一样 在脚本到处调用这个变量
 - Mac/OSX上安装xshell
			
xshell没有mac版,且不愿意仅为一个程序运行一个虚拟机.怎么办?装上wine个来跑shell吧! 1.安装 WineBottler 过程略(制作.管理windows程序,类似CrossOver) ...
 - nmon 命令
			
nmon 命令 用途 以交互方式显示本地系统统计信息并以记录方式记录系统统计信息. 语法 交互方式: nmon [ -h ] nmon [ -s < seconds >] [ -c < ...