Num post de blog anterior, introduzimos um conceito muito importante na programação orientada para objectos: Aulas. Agora vamos passar por outro conceito central: Herança, o mecanismo que permite a uma classe adquirir o comportamento de outra classe.
Lembra-se do exemplo no post anterior do blogue com a classe “Pessoa” ? Imaginemos uma escola e queremos gerir alunos e professores. Ambos são pessoas, mas com características diferentes. Assim, criamos uma classe “Professor” e uma classe “Estudante”, e ambas as classes herdam características da classe “Pessoa”.
Como se herda uma classe de outra?
Uma nova Class extends A palavra-chave está agora disponível para facilitar a herança. Usando o nosso exemplo escolar, criamos uma classe “Estudante” que herda a classe “Pessoa”.
Class Extends Person
E o construtor?
Então para o construtor (se não tiver definido um construtor específico para a classe “Estudante”), o construtor da classe “Pessoa” é automaticamente chamado.
Também se pode substituir um construtor. Por exemplo no caso de “Estudante”: um estudante tem um nome, apelido, e data de nascimento como pessoa, mas um estudante também tem uma nota e uma escola. Neste caso, pode utilizar o novo Super o que lhe permite chamar o construtor da classe mãe. Depois, no construtor “Estudante”, pode adicionar o código específico da classe e da escola.
Class constructor
.
C_TEXT( ) ( ) ( ) ( ) ( ) ( ; ; ) $1 // FirstName
C_TEXT$2 // LastName
C_DATE$3 // Birthdate
C_TEXT$4 // SchoolName
C_TEXT$5 // Grade
Super$1$2$3 // Call the "Person" constructor
ThisSchoolName:= $4
This . :=Grade$5
E as funções?
Pode adicionar funções específicas à classe “Estudante” a partir da qual pode chamar uma função da classe mãe (“Pessoa”).
No exemplo seguinte, temos uma função que devolve uma string contendo o nome do aluno, a nota, e a escola. Na turma “Pessoa”, já temos uma função que devolve o nome completo de uma pessoa. Assim, chamamos a esta função, getFullName, e acrescentamos a informação específica de um aluno.
Function getIdentity
C_TEXT( ) := . ()+", "+ . +" nota em "+ .$0
$0SupergetFullNameThisGradeThisSchoolName
Num método, instanciamos uma instância da classe “Estudante”. Chamamos à função getFullName da turma “Pessoa” da classe “Pais”. Depois, chamamos à função getIdentity da turma “Estudante”. Como se pode ver, não há diferenças entre as funções getFullName e getIdentity.
C_OBJECT($s)
$s :=cs.Student.new("Joe"; "Doe";!2002-02-20!; "Waco High School"; "10")
$name :=$s.getFullName() //return John Doe
$identity :=$s.getIdentity(
) //return Joe DOE, 10th grade in Waco High School