Herança é a capacidade de qualquer classe de extrair e usar recursos de outras classes. É o processo pelo qual novas classes chamadas classes derivadas são criadas a partir de classes existentes chamadas classes base . O conceito básico aqui é que o programador é capaz de usar os recursos de uma classe em outra sem declarar ou definir a mesma coisa repetidamente em classes diferentes. Em vez de escrever as funções de membro durante cada declaração de classe, podemos herdá-las da classe base. Herança é um dos recursos mais importantes da Programação Orientada a Objetos.

Subclasse: A classe que herda propriedades de outra classe é chamada de Subclasse ou Classe Derivada.
Superclasse: a classe cujas propriedades são herdadas pela subclasse é chamada de Classe Base ou Superclasse

O conceito mais básico de herança é criar ou derivar uma nova classe usando outra classe como base.

Classe Base e Classe Derivada

A classe base é usada para derivar subclasses herdadas adicionais conhecidas como classes derivadas . Pode haver várias classes derivadas de uma única classe base, esse tipo de herança é chamado de Herança Hierárquica . Essas classes derivadas compartilham uma única classe pai ou classe base. Se uma classe derivada compartilha várias classes pai e herda seus recursos de várias classes pai, esse tipo de herança é chamado de herança múltipla .


A imagem acima mostra a ordem em que uma classe é derivada de uma classe base. Sempre que houver necessidade de representar teoricamente a ordem de herança, serão utilizadas a ordem e as denotações apresentadas na imagem acima.

Considere uma classe de veículos. Agora precisamos criar uma classe para ônibus, carro, caminhão, etc. Os métodos fuelAmount(), capacity(), applyBrakes() serão os mesmos para todos os veículos. Se criarmos essas classes sem o conhecimento de herança, então podemos fazer da maneira mostrada no diagrama: A imagem

acima mostra a criação dessas classes sem o conceito de Herança

Pode ser visto claramente que o processo acima resulta na duplicação do mesmo código 3 vezes. Isso aumenta as chances de erro e redundância de dados. Para evitar esse tipo de situação, a herança é usada. Se criarmos uma classe Vehicle e escrevermos essas três funções nela e herdarmos o resto das classes da classe Vehicle, podemos simplesmente evitar a duplicação de dados e aumentar a reutilização. Observe o diagrama abaixo, no qual as três classes são herdadas da classe do veículo:


Usando a herança, temos que escrever as funções apenas uma vez em vez de três, pois herdamos o restante das três classes da classe base (Veículo).

Herança multinível

A herança em Perl pode ser de vários tipos, mas a herança multinível é aquela em que existe uma cadeia da classe base e das classes derivadas. Na Herança multinível, uma classe derivada herdará uma classe base e, assim como a classe derivada, também atuará como a classe base para outra classe. Na imagem abaixo, a classe A serve como uma classe base para a classe derivada B, que por sua vez serve como uma classe base para a classe derivada C

Implementando herança em Perl:

A herança em Perl pode ser implementada com o uso de pacotes . Os pacotes são usados ​​para criar uma classe pai que pode ser usada nas classes derivadas para herdar as funcionalidades.

use strict;
use warnings;
  
# Creating parent class
package Employee;
  
# Creating constructor
sub new
{
    # shift will take package name 'employee' 
    # and assign it to variable 'class'
    my $class = shift;
      
    my $self = {
                'name' => shift,
                'employee_id' => shift
               };
      
    # Bless function to bind object to class
    bless $self, $class;
      
    # returning object from constructor
    return $self;
}
1;

O código acima é a definição da classe base. Aqui, a classe base é funcionário com os membros de dados sendo o id do funcionário e o nome do funcionário. Este código para a classe pai precisa ser salvo como * .pm, aqui vamos salvá-lo como employee.pm . Veremos agora como derivar uma classe do funcionário da classe base já declarado.

# Creating parent class
package Department;
   
use strict;
use warnings;
   
# Using class employee as parent 
use parent 'employee';
   
1;

Como visto no exemplo acima, a classe Departamento usa as características do funcionário da classe já declarado. Portanto, ao declarar a classe Department, não declaramos todos os membros de dados novamente, em vez disso, os herdamos do funcionário da classe base. Para executar este código, salve o código da classe intermediária como * .pm, aqui ele é salvo como Department.pm . Esta classe é a classe intermediatory e continuará a trabalhar como uma classe pai para os seguintes dados de arquivo derivadas data.pl .

use strict;
use warnings;
   
# Using Department class as parent
use Department;
  
# Creating object and assigning values 
my $a = Department->new("Shikhar",18017);
   
# Printing the required fields
print "$a->{'name'}\n";
print "$a->{'employee_id'}\n";

Saída:

Portanto, a herança desempenha um papel muito importante ao trabalhar em um grande projeto e o programador deseja encurtar o código.