
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")本文分享自 MedBioInfoCloud 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!