首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生信人的R语言视频教程-语法篇-第十二章:面向对象编程(S3类与S4类)

生信人的R语言视频教程-语法篇-第十二章:面向对象编程(S3类与S4类)

作者头像
DoubleHelix
发布2020-06-10 17:25:34
4970
发布2020-06-10 17:25:34
举报
文章被收录于专栏:生物信息云生物信息云

1 什么是面向对象?

面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。早期的计算机编程是基于面向过程的方法,例如实现算术运算2+3+4=9,通过设计一个算法就可以解决当时的问题。

随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

面向对象的3个特征:封装,继承,多态

封装:是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承:子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”;被继承的类称为“基类”、“父类”或“超类”。

多态: 指由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应。

stringAsFactors=FALSE
#创建一个S3类
me = list(name = "DoubleHelix",Age = 27,Gender = "male")
me
me[["Major"]] <- "bioinformatics"
me
#S3类可以通过$来访问类的属性
me$name
class(me)

class(me) <- append(class(me),"Person")
class(me)
me

Person <- function(name,age,Gender){
  name = name
  age = age
  Genter = Gender
  aPerson = list(name,age,Genter)# 给类取名
  class(aPerson) = append(class(aPerson),"Person")
  return(aPerson)
}

Person1 <- Person(name = "Darren",age = 18,Gender = "Man")
Person5 <- Person(name = "zhangsan",age = 16,Gender = "Man")
class(Person1)

student <- function(name,age,Gender,ID){
  student = Person(name,age,Gender)
  student$ID = ID
  class(student) <- append(class(student), "student") 
  return(student)
}

Person2 <- student(name = "Alis",age = 20,Gender = "woman",ID = "2020090418")
class(Person2)

# 泛型函数
x <- 1:20
y <- 1:20 + rnorm(20)
plot(x,y)
fit <- lm(y~x)
plot(fit, 1)
class(fit)
methods(plot)

#创建泛型函数
speak <- function(object){
  UseMethod("speak", object)
}
speak.default <- function(object){
  print("正常人都具有说话的功能")
}
speak(Person2)
speak.student<- function(object){
  print("我是学生,我具有学习的能力")
}
speak(Person2)

###---------------------S4类-------------------
# setClass(Class, representation, prototype, contains=character(), 
#          validity, access, where, version, sealed, package,  
#          S3methods = FALSE, slots)
#Class:定义的类名
#slots:定义类的属性
#prototype:定义属性的默认值(这个有什么用,我还没有发掘)
#contains = character():定义父类和继承关系
#where:定义存储空间
#sealed:若是TRUE,则同类名不能被定义
#package:定义所属包

setClass("Person", slots = list(name="character",age="numeric"))

#实例化一个人,也就是创建一个对象
Person3 <- new("Person",name="potter",age=49) 
Person3

#创建一个子类
setClass("Student",slots = list(ID="character",school= "character"),
         contains = "Person")#contain表明类的继承关系,继承自Person
#实例化类
Person3 <- new("Person",name="potter",age=49)

Student1 <- new("Student",name="liming",age=16,ID="2020051419",school="Taiwan University")

Student1

Student1@name
Student1@school

work<-function(x) cat(x, "is working")
work('Conan')
# 定义Person对象
setClass("Person",slots=list(name="character",age="numeric"))
# 定义泛型函数work,即接口
setGeneric("work",function(object) standardGeneric("work"))
# 定义work的实现,并指定参数类型为Person对象
setMethod("work", signature(object = "Person"), function(object) cat(object@name , "is working") )
# 创建一个Person对象a
a<-new("Person",name="Conan",age=16)
# 把对象a传入work函数
work(a)
# 检查work的类型
class(work)
# 直接查看work函数
work
# 查看work函数的现实定义
showMethods(work)
# 查看Person对象的work函数现实
getMethod("work", "Person")
selectMethod("work", "Person")
# 检查Person对象有没有work函数
existsMethod("work", "Person")
hasMethod("work", "Person")
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MedBioInfoCloud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档