Programação Orientada a Objetos com C# (Parte 4.14) – Herança » Link Sinergia
Programação Orientada a Objetos com C# (Parte 4.14) – Herança
Este tema da série Programação Orientada a Objetos com C# encerra-se nesta publicação. Sendo assim, a numeração sequencial desta parte da série finaliza-se de 4.13 para 4.14 (vide título).
Com a Introdução e apresentação de um novo aspecto no cenário exemplificado, denominado Integração (vide post anterior), o próximo passo na Programação Orientada a Objetos com C# será dar continuidade a estes assuntos e suas variantes, vistas até o momento presente.
Foi alterado o método CobraTarifa() como membro da classe Bilhete, de maneira a prepará-lo para execução sem a passagem de parâmetros, além disso este método está com o modificador de acesso como public.
A utilização da palavra reservada virtual é um conceito novo, ainda não explicado.
Lembrando que, para garantir a utilização da técnica Herança no cenário estabelecido, a Classe Bilhete serve como classe Pai ou classe Base para as classes que a Herdam.
À partir desta declaração, a classe Bilhete detém todas as características em comum a utilização das Classes Filhas ou Descendentes.
No caso do método CobraTarifa(), a palavra virtual provê além da utilização fiel deste método pelas classes filhas, a utilização modificada deste mesmo método dentro de suas estruturas internas, de maneira a particulariza-lo (será entendido posteriormente).
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication { public class UnicoComum : Bilhete { private decimal saldo = 100.00m; public decimal Saldo() { return saldo; } private DateTime dataPrimeiraPassagem; public DateTime DataPrimeiraPassagem { get { return dataPrimeiraPassagem; } set { dataPrimeiraPassagem = value; } } private decimal tarifa; public override decimal CobraTarifa() { TimeSpan diferencaHora = dataPrimeiraPassagem - DateTime.Now; tarifa = base.CobraTarifa(); if (diferencaHora.Hours <= 2) { tarifa = tarifa + 2.12m; } return tarifa; } public void Debita() { saldo = saldo - tarifa; } } }
public class UnicoComum : Bilhete
Foi criada a variável de instância dataPrimeiraPassagem como membro da classe UnicoComum, sendo esta do tipo DateTime. Além disto, a variável está com o modificador de acesso como private, ou seja, acessível apenas dentro da classe UnicoComum.
Foi criada a variável de instância tarifa como membro da classe UnicoComum, sendo esta do tipo decimal. Além disto, a variável está com o modificador de acesso como private, ou seja, acessível apenas dentro da classe UnicoComum.
Foram criados os métodos Saldo(), CobraTarifa() e Debita() como membros da classe UnicoComum, de maneira a prepará-los para execução sem a passagem de parâmetros. Além disso estes métodos estão com o modificador de acesso como public.
No método CobraTarifa() sua ação se estabelece de maneira a guardar e retornar a variável tarifa, realizando antes disso uma operação de comparação que determina se a diferença em horas entre a data da primeira utilização como passagem e a data atual é menor ou igual a 2 (horas). Em caso positivo será reutilizada a tarifa padrão, vinda da classe Pai como base de cálculo (base.CobraTarifa()), mais o valor de 2.12. Caso contrário será cobrado o valor de 3.80 que é a tarifa padrão (base.CobraTarifa()).
A utilização da palavra reservada override é um conceito novo, ainda não explicado.
Para criação e execução de um método com o mesmo nome da classe Pai na classe Filha, em exemplo CobraTarifa(), é necessária a utilização da palavra override após a declaração de seu modificador de acesso (o exemplo de declaração abaixo confere):
A palavra reservada override informa ao compilador que o método CobraTarifa() irá sobrescrever o método de mesmo nome criado na classe Herdada Bilhete dentro da classe UnicoComum. Uma segunda condição para atender essa técnica é que, juntamente ao método CobraTarifa() da classe Pai haja a palavra reservada virtual.
Outro detalhe importante é que o método CobraTarifa() da classe Bilhete ainda poderá ser acessado dentro da classe UnicoComum através da seguinte definição base.CobraTarifa().
No método Debita(), sua ação se estabelece de maneira a guardar a variável saldo, realizando antes disso uma operação de subtração que determina o valor da variável saldo menos o valor da tarifa (obtida através da execução do método CobraTarifa(), sobrescrito na classe UnicoComum).
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication { class Program { static void Main(string[] args) { Unitario objUnitario = new Unitario(); objUnitario.Tipo = "Papel"; objUnitario.Cor = "Branca"; Console.WriteLine("O Bilhete Unitário é de {0}, possui a cor {1} e ao passar na catraca, cobra-se uma tarifa de: R${2}", objUnitario.Tipo, objUnitario.Cor, objUnitario.CobraTarifa()); EspecialDesempregado objEspecialDesempregado = new EspecialDesempregado(); objEspecialDesempregado.Tipo = "Papel"; objEspecialDesempregado.Cor = "Amarela"; objEspecialDesempregado.DataValidade = DateTime.Now.AddDays(90); Console.WriteLine("O Bilhete Especial Desempregado é de {0}, possui a cor {1} e é valido até {2}", objEspecialDesempregado.Tipo, objEspecialDesempregado.Cor, objEspecialDesempregado.DataValidade); UnicoComum objUnicoComum = new UnicoComum(); objUnicoComum.Tipo = "Plástico"; objUnicoComum.Cor = "Vermelha"; objUnicoComum.DataPrimeiraPassagem = DateTime.Now.AddHours(1); Console.WriteLine("O Bilhete Único Comum apresenta inicialmente um saldo de R${0}", objUnicoComum.Saldo()); Console.WriteLine("O Bilhete Único Comum é de {0}, possui a cor {1} e sua primeira utilização ocorreu em {2}", objUnicoComum.Tipo, objUnicoComum.Cor, objUnicoComum.DataPrimeiraPassagem); Console.WriteLine("O Bilhete Único Comum ao passar na catraca com integração, cobra-se uma tarifa de: R${0}", objUnicoComum.CobraTarifa()); objUnicoComum.Debita(); Console.WriteLine("O Bilhete Único Comum apresenta após utilização de uma passagem com integração, um saldo disponível de R${0}", objUnicoComum.Saldo()); Console.ReadKey(); } } }
Linha 36: encerramento do código.
Diante do cenário sistema metropolitano (estabelecido ao longo da série), o valor atribuído a Propriedade DataPrimeiraPassagem representa o primeiro horário do dia em que o passageiro utilizou seu bilhete único comum e portanto, terá 1 hora de 2 horas (por direito) como garantia para reutiliza-lo como integração (uma vez que fora acrescentada 1 hora à título de estudo como tempo corrido após a primeira utilização).
O valor retornado do Método CobraTarifa() representa o valor da tarifa cobrada como integração e que dá direito a uma passagem mais barata através do Bilhete Único Comum. Além disso o Método CobraTarifa() foi sobrecarregado na Classe Descendente UnicoComum e a tarifa padrão reaproveitada através de Herança.
Esta publicação visa alterar as Classes UnicoComum, Bilhete e Program de maneira que o leitor possa entender a aplicabilidade de técnicas que referem-se a divisão de responsabilidades entre métodos estabelecidos em um contexto de Herança, comunicação e funções que cada uma destas desempenham entre si entre outros elementos e conceitos da Orientação a Objetos descritos até o momento
Os detalhes da execução da Aplicação neste post, são embasados na busca de fatos que ocorrem na vida real. Ao utilizar um Bilhete Único Comum em um meio de transporte como por exemplo um ônibus, o passageiro tem até 2 horas para reutiliza-lo e garantir uma passagem de integração. Obviamente num contexto completo, haveriam muito mais detalhes e lógicas a serem empregadas nesta regra de negócios, mas para compreensão didática, o autor acredita estar no caminho mais plausível para o leitor.
Na próxima publicação, quinta parte da série: Programação Orientada a Objetos com C# será apresentado o conceito de Polimorfismo.
Link permanente para este artigo: http://linksinergia.com.br/2016/05/18/programacao-orientada-a-objetos-com-c-parte-4-14-heranca-rascunho/