R – Inheritance
Inheritance is one of the concept in object oriented programming by which new classes can derived from existing or base classes helping in re-usability of code. Derived classes can be the same as a base class or can have extended features which creates a hierarchical structure of classes in the programming environment. In this article, we’ll discuss how inheritance is followed out with three different types of classes in R programming.
Inheritance in S3 Class
S3 class in R programming language has no formal and fixed definition. In an S3 object, a list with its class attribute is set to a class name. S3 class objects inherit only methods from its base class.
Example:
# 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" ) |
Output:
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
Inheritance in S4 Class
S4 class in R programming have proper definition and derived classes will be able to inherit both attributes and methods from its base class.
Example:
# 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) |
Output:
Utkarsh 21 96
Inheritance in Reference Class
Inheritance in reference class is almost similar to the S4 class and uses setRefClass()
function to perform inheritance.
Example:
# 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 |
Output:
[1] 16 Error in s$dec_age(20) : Age cannot be negative [1] 16
Please Login to comment...