R 中的面向对象(1)

面向对象
Author

大番薯本薯

Published

March 16, 2025

Modified

March 16, 2025

概述

成为面对对象的五个条件

  • 对象
  • 继承
  • 封装
  • 多态

定义一个,这个类有一些属性和方法,方法被封装为接口和实现;类可以实例化一个对象;类之间具有父子关系,子类可以继承父类的属性和方法;不同类的方法名是重复的,可以根据类选择对应的实现,这称之为多态

为什么使用面向对象:

  • 封装提供了标准的使用接口,能够降低系统的耦合度。
  • 继承允许子类继承父类的特性,提高了代码的重用性。
  • 多态允许相同函数对于不同的类有不同的行为,提高了代码的灵活性。

想象一下,当你想更新一个函数的使用方法,但是又得保持和以前的兼容性,你只需要再创建一个子类,然后重新实现父类的方法,就可以了。

R 中的面向对象

R 语言中存在多种面向对象的编程,包括封装类的如RC,R6;泛函类的如S3,S4等。

  • 基于S3的面向对象编程基于泛型函数(generic function),不基于类层级结构,没有类的继承,没有严格的层级结构式继承。
  • 基于S4的面向对象编程,相对S3健全,实现了类的继承,具有严格的层级结构式类继承,但是是在函数封装过程中同S3一样,基于泛型函数。
  • 基于RC(也称S5)的面向对象编程则更加完善,符合上面的要求。
  • 基于R6包的面向对象编程,同样符合上面的要求。
  • 基于proto包的面向对象编程在ggplot2包中使用。
  • 基于R.oo包的面向对象编程类似S3。

sloop 包

包中的函数sloop::otype()可以用来检查对象的面向对象编程类型。

library(sloop)

otype(1:10)
#> [1] "base"

otype(mtcars)
#> [1] "S3"

mle_obj <- stats4::mle(function(x = 1) (x - 2)^2)
otype(mle_obj)
#> [1] "S4"
Back to top