R- Herencia

La herencia es uno de los conceptos en la programación orientada a objetos por el cual las nuevas clases pueden derivar de las clases base o existentes que ayudan en la reutilización del código. Las clases derivadas pueden ser las mismas que una clase base o pueden tener características extendidas que crean una estructura jerárquica de clases en el entorno de programación. En este artículo, discutiremos cómo se sigue la herencia con tres tipos diferentes de clases en la programación R.

Herencia en la clase S3

La clase S3 en el lenguaje de programación R no tiene una definición formal y fija. En un objeto de S3, una lista con su atributo de clase se establece en un nombre de clase. Los objetos de clase S3 heredan solo métodos de su clase base.

Ejemplo:

# Create a function to create an object of class
student <- function(n, a, r){
  value <- list(name = n, age = a, rno = r)
  attr(value, "class") <- student
  value
}
  
# Method for generic function print()
print.student <- function(obj){
  cat(obj$name, "\n")
  cat(obj$age, "\n")
  cat(obj$rno, "\n")
}
  
# Create an object which inherits class student
s <- list(name = "Utkarsh", age = 21, rno = 96,
          country = "India")
  
# Derive from class student
class(s) <- c("InternationalStudent", "student")
  
cat("The method print.student() is inherited:\n")
print(s)
  
# Overwriting the print method
print.InternationalStudent <- function(obj){
cat(obj$name, "is from", obj$country, "\n")
}
  
cat("After overwriting method print.student():\n")
print(s)
  
# Check imheritance
cat("Does object 's' is inherited by class 'student' ?\n")
inherits(s, "student")

Producción:

The method print.student() is inherited:
Utkarsh 
21 
96 
After overwriting method print.student():
Utkarsh is from India
Does object 's' is inherited by class 'student' ?
[1] TRUE

Herencia en Clase S4

La clase S4 en la programación R tiene una definición adecuada y las clases derivadas podrán heredar tanto los atributos como los métodos de su clase base.

Ejemplo:

# Define S4 class
setClass("student",
         slots = list(name = "character", 
                      age = "numeric", rno = "numeric") 
)
   
# Defining a function to display object details
setMethod("show", "student",
          function(obj){
            cat(obj@name, "\n")
            cat(obj@age, "\n")
            cat(obj@rno, "\n")
          } 
)
   
# Inherit from student
setClass("InternationalStudent",
slots = list(country = "character"),
contains = "student"
)
   
# Rest of the attributes will be inherited from student
s <- new("InternationalStudent", name = "Utkarsh", 
         age = 21, rno = 96, country="India")
show(s)

Producción:

Utkarsh 
21 
96 

Herencia en la clase de referencia

La herencia en la clase de referencia es casi similar a la clase S4 y usa setRefClass()la función para realizar la herencia.

Ejemplo:

# Define class
student <- setRefClass("student",
   fields = list(name = "character",
                 age = "numeric", rno = "numeric"),
   methods = list(
     inc_age <- function(x) {
       age <<- age + x
     },
     dec_age <- function(x) {
       age <<- age - x
     }
   )
)
  
# Inheriting from Reference class
InternStudent <- setRefClass("InternStudent", 
   fields = list(country = "character"), 
   contains = "student",
   methods = list(
   dec_age <- function(x) {
     if((age - x) < 0)  stop("Age cannot be negative")
     age <<- age - x
   }
   ) 
)
  
# Create object
s <- InternStudent(name = "Utkarsh",
                   age = 21, rno = 96, country = "India")
  
cat("Decrease age by 5\n")
s$dec_age(5)
s$age
  
cat("Decrease age by 20\n")
s$dec_age(20) 
s$age

Producción:

[1] 16 
Error in s$dec_age(20) : Age cannot be negative
[1] 16

Publicación traducida automáticamente

Artículo escrito por utkarsh_kumar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *