Menu English Ukrainian Russo Início

Biblioteca técnica gratuita para amadores e profissionais Biblioteca técnica gratuita


Информатика и информационные технологии. Ассемблер (конспект лекций)

Notas de aula, folhas de dicas

Diretório / Notas de aula, folhas de dicas

Comentários do artigo Comentários do artigo

Índice (expandir)

PALESTRA Nº 13. Compatibilidade de tipos de objetos

1. Encapsulamento

A combinação de código e dados em um objeto é chamada de encapsulamento. Em princípio, é possível fornecer métodos suficientes para que o usuário de um objeto nunca acesse diretamente os campos do objeto. Algumas outras linguagens orientadas a objetos, como Smalltalk, requerem encapsulamento obrigatório, mas o Borland Pascal tem uma escolha.

Por exemplo, os objetos TEmployee e THourly são escritos de tal forma que não há absolutamente nenhuma necessidade de acessar diretamente seus campos de dados internos:

tipo

Temployee = objeto

Nome, Título: string[25];

Taxa: Reais;

procedimento Init(AName, ATitle: string; ARate: Real);

função GetName : String;

função GetTitle : String;

função GetRate : Real;

função GetPayAmount : Real;

end;

THourly = object(TEFuncionário)

Hora: Inteiro;

procedimento Init(AName, ATitle: string; ARate:

Real, Atime: Inteiro);

função GetPayAmount : Real;

end;

Existem apenas quatro campos de dados aqui: Nome, Título, Taxa e Tempo. Os métodos GetName e GetTitle exibem o sobrenome e a posição do trabalhador, respectivamente. O método GetPayAmount usa Rate, e no caso de um trabalho THourly e Time para calcular o valor dos pagamentos ao trabalho. Não há mais necessidade de se referir diretamente a esses campos de dados.

Assumindo a existência de uma instância AnHourly do tipo THourly, poderíamos usar um conjunto de métodos para manipular campos de dados AnHourly como este:

com um fazer de hora em hora

começar

Init (Aleksandr Petrov, operador de empilhadeira' 12.95, 62);

{Exibe o sobrenome, cargo e valor dos pagamentos}

Exposição;

end;

Deve-se notar que o acesso aos campos de um objeto é realizado apenas com a ajuda de métodos desse objeto.

2. Objetos em expansão

Infelizmente, o Pascal padrão não oferece nenhum recurso para criar procedimentos flexíveis que permitem trabalhar com tipos de dados completamente diferentes. A programação orientada a objetos resolve esse problema com herança: se um tipo derivado for definido, os métodos do tipo pai serão herdados, mas poderão ser substituídos, se desejado. Para substituir um método herdado, simplesmente declare um novo método com o mesmo nome do método herdado, mas com um corpo diferente e (se necessário) um conjunto de parâmetros diferente.

Vamos definir um tipo filho de TEmployee que representa um funcionário que recebe uma taxa horária no exemplo a seguir:

const

Períodos de Pagamento = 26; { períodos de pagamento }

Limite de horas extras = 80; { para o período de pagamento }

Fator Hora Extra = 1.5; { taxa horária }

tipo

THourly = object(TEFuncionário)

Hora: Inteiro;

procedimento Init(AName, ATitle: string; ARate:

Real, Atime: Inteiro);

função GetPayAmount : Real;

end;

procedimento THourly.Init(AName, ATitle: string;

ARate: Real, Atime: Inteiro);

começar

TEmployee.Init(ANome, ATitle, ARate);

Hora := AHora;

end;

função THourly.GetPayAmount: Real;

var

Horas extras: Inteiro;

começar

Horas Extras := Horas - OvertimeThreshold;

se Horas extras > 0 então

GetPayAmount := RoundPay(Extratempo Limite * Taxa +

Taxa Hora Extra * Fator Hora Extra * Taxa)

outro

GetPayAmount := RoundPay(Tempo * Taxa)

end;

Uma pessoa que recebe uma taxa horária é um trabalhador: ele tem tudo o que é usado para definir o objeto TEmployee (nome, cargo, taxa), e apenas a quantidade de dinheiro recebida pelo horista depende de quantas horas ele trabalhou durante o prazo a pagar. Assim, Thourly também requer um campo Time.

Como o THourly define um novo campo Time, sua inicialização requer um novo método Init que inicializa os campos time e herdados. Em vez de atribuir valores diretamente aos campos herdados, como Nome, Título e Taxa, por que não reutilizar o método de inicialização do objeto TEmployee (ilustrado pela primeira instrução THourly Init).

Chamar um método que está sendo substituído não é o melhor estilo. Em geral, é possível que TEmployee.Init execute uma inicialização importante, mas oculta.

Ao chamar um método substituído, você deve ter certeza de que o tipo de objeto derivado inclui a funcionalidade do pai. Além disso, qualquer alteração no método pai afeta automaticamente todos os métodos filho.

Após chamar TEmployee.Init, THourly.Init pode então realizar sua própria inicialização, que neste caso consiste apenas em atribuir o valor passado em ATime.

Outro exemplo de um método substituído é a função THourly.GetPayAmount, que calcula o valor do pagamento para um funcionário horista. Na verdade, cada tipo de objeto TEmployee tem seu próprio método GetPayAmount, já que o tipo de trabalhador depende de como o cálculo é feito. O método THourly.GetPayAmount deve levar em consideração quantas horas o funcionário trabalhou, se houve horas extras, qual foi o fator de aumento para horas extras, etc.

Método TSsalariado. GetPayAmount deve apenas dividir a taxa do funcionário pelo número de pagamentos em cada ano (no nosso exemplo).

trabalhadores da unidade;

interface

const

Períodos de Pagamento = 26; {no ano}

Limite de horas extras = 80; {para cada período de pagamento}

Fator Hora Extra=1.5; {aumento em relação ao pagamento normal}

tipo

Temployee = objeto

Nome, Título: string[25];

Taxa: Reais;

procedimento Init(AName, ATitle: string; ARate: Real);

função GetName : String;

função GetTitle : String;

função GetRate : Real;

função GetPayAmount : Real;

end;

THourly = object(TEFuncionário)

Hora: Inteiro;

procedimento Init(AName, ATitle: string; ARate:

Real, Atime: Inteiro);

função GetPayAmount : Real;

função GetTime : Real;

end;

TSalariado = objeto(TEfuncionário)

função GetPayAmount : Real;

end;

TComissionado = objeto(TSalariado)

Comissão : Real;

Valor de Vendas : Real;

construtor Init(AName, ATitle: String; ARate,

AComissão, ASVendasValor: Real);

função GetPayAmount : Real;

end;

implementação

função RoundPay(Wages: Real) : Real;

{arredondar os pagamentos para ignorar valores inferiores a

unidade monetária}

começar

RoundPay := Trunc(Salários * 100) / 100;

.

.

.

TEmployee é o topo da nossa hierarquia de objetos e contém o primeiro método GetPayAmount.

função TEmployee.GetPayAmount : Real;

começar

RunError(211); { dá erro de tempo de execução }

end;

Pode ser uma surpresa que o método dê um erro em tempo de execução. Se Employee.GetPayAmount for chamado, ocorrerá um erro no programa. Por quê? Porque TEmployee é o topo da nossa hierarquia de objetos e não define um trabalhador real; portanto, nenhum dos métodos TEmployee é chamado de uma maneira específica, embora possam ser herdados. Todos os nossos funcionários são horistas, assalariados ou por peça. Um erro em tempo de execução encerra a execução do programa e gera 211, que corresponde a uma mensagem de erro associada a uma chamada de método abstrato (se o programa chamar TEmployee.GetPayAmount por engano).

Abaixo está o método THourly.GetPayAmount, que leva em consideração coisas como pagamento de horas extras, horas trabalhadas etc.

função THourly.GetPayAMount : Real;

var

Horas Extras: Inteiro;

começar

Horas Extras := Horas - OvertimeThreshold;

se Horas extras > 0 então

GetPayAmount := RoundPay(Extratempo Limite * Taxa +

Taxa Hora Extra * Fator Hora Extra * Taxa)

outro

GetPayAmount := RoundPay(Tempo * Taxa)

end;

O método TSalaried.GetPayAmount é muito mais simples; nele aposta

dividido pelo número de pagamentos:

função TSalaried.GetPayAmount : Real;

começar

GetPayAmount := RoundPay(Taxa / PayPeriods);

end;

Se você observar o método TCommissioned.GetPayAmount, verá que ele chama TSalaried.GetPayAmount, calcula a comissão e a adiciona ao valor retornado pelo método TSalaried. GetPayAmount.

função TСommissioned.GetPayAmount : Real;

começar

GetPayAmount := RoundPay(TSalaried.GetPayAmount +

Comissão * Valor de Vendas);

end;

Observação importante: Embora os métodos possam ser substituídos, os campos de dados não podem ser substituídos. Depois que um campo de dados é definido em uma hierarquia de objetos, nenhum tipo filho pode definir um campo de dados com exatamente o mesmo nome.

3. Compatibilidade de tipos de objetos

A herança modifica as regras de compatibilidade de tipo do Borland Pascal até certo ponto. Entre outras coisas, um tipo derivado herda a compatibilidade de tipo de todos os seus tipos pai.

Essa compatibilidade de tipo estendida assume três formas:

1) entre implementações de objetos;

2) entre ponteiros para implementações de objetos;

3) entre parâmetros formais e reais.

No entanto, é muito importante lembrar que em todas as três formas, a compatibilidade de tipo só se estende do filho ao pai. Em outras palavras, os tipos filho podem ser usados ​​livremente no lugar dos tipos pai, mas não vice-versa.

Por exemplo, TSalaried é filho de TEmployee e TSosh-missioned é filho de TSalaried. Com isso em mente, considere as seguintes descrições:

modelo

PEfuncionário = ^TEFuncionário;

PSAssalariado = ^TSAssalariado;

PComissionado = ^TComissionado;

var

UmFuncionário: TEFuncionário;

AAssalariado: TAssalariado;

PComissionado: TComissionado;

TEmployeePtr: PEemployee;

TSsalárioPtr: PSsalário;

TComissionadoPtr: PComissionado;

Sob essas descrições, os seguintes operadores são válidos

atribuições:

UmFuncionário :=ASAssalariado;

AAssalariado := AComissionado;

TCommissionedPtr := AComissionado;

Nota

Um objeto pai pode receber uma instância de qualquer um de seus tipos derivados. Atribuições de volta não são permitidas.

Esse conceito é novo para o Pascal e, a princípio, pode ser difícil lembrar qual é a compatibilidade do tipo de pedido. Você precisa pensar assim: a fonte deve ser capaz de preencher completamente o receptor. Os tipos derivados contêm tudo o que seus tipos pai contêm devido à propriedade de herança. Portanto, o tipo derivado é exatamente do mesmo tamanho ou (o que ocorre com mais frequência) é maior que seu pai, mas nunca menor. Atribuir um objeto pai (pai) a um filho (filho) pode deixar alguns campos do objeto filho indefinidos, o que é perigoso e, portanto, ilegal.

Nas instruções de atribuição, apenas os campos comuns a ambos os tipos serão copiados da origem para o destino. No operador de atribuição:

AnFuncionário:= AComissionado;

Somente os campos Nome, Título e Taxa de ACommissioned serão copiados para AnEmployee, pois esses são os únicos campos comuns a TCommissioned e TEmployee. A compatibilidade de tipos também funciona entre ponteiros para tipos de objetos e segue as mesmas regras gerais das implementações de objetos. Um ponteiro para um filho pode ser atribuído a um ponteiro para o pai. Dadas as definições anteriores, as seguintes atribuições de ponteiro são válidas:

TSalariedPtr:= TCommissionedPtr;

TEmployeePtr:= TSalariedPtr;

TEmployeePtr:= PComissionedPtr;

Lembre-se que atribuições inversas não são permitidas!

Um parâmetro formal (um valor ou um parâmetro de variável) de um determinado tipo de objeto pode ter como parâmetro real um objeto de seu próprio tipo ou objetos de todos os tipos filho. Se você definir um cabeçalho de procedimento como este:

procedimento CalcFedTax(Vítima: TSalaried);

então os tipos de parâmetros reais podem ser TSalaried ou TCommissioned, mas não TEmployee. A vítima também pode ser um parâmetro variável. Nesse caso, as mesmas regras de compatibilidade são seguidas.

Nota

Há uma diferença fundamental entre os parâmetros de valor e os parâmetros de variável. Um parâmetro de valor é um ponteiro para o objeto real passado como parâmetro, enquanto um parâmetro variável é apenas uma cópia do parâmetro real. Além disso, essa cópia inclui apenas os campos incluídos no tipo do parâmetro de valor formal. Isso significa que o parâmetro real é literalmente convertido para o tipo do parâmetro formal. Um parâmetro variável é mais como uma conversão para um padrão, no sentido de que o parâmetro real permanece inalterado.

Da mesma forma, se o parâmetro formal for um ponteiro para um tipo de objeto, o parâmetro real pode ser um ponteiro para esse tipo de objeto ou para qualquer tipo filho. Seja dado o título do procedimento:

procedimento Worker.Add(AWorker: PSalared);

Os tipos de parâmetros reais válidos seriam então PSalaried ou PCommissioned, mas não PEmployee.

Autor: Tsvetkova A.V.

<< Voltar: Compatibilidade do tipo de objeto (Encapsulamento. Objetos extensíveis. Compatibilidade de tipo de objeto)

>> Encaminhar: Registros (Registros do sistema microprocessador. Registros de controle. Registros de endereço do sistema. Registros de depuração)

Recomendamos artigos interessantes seção Notas de aula, folhas de dicas:

Didática. Notas de aula

Controle de qualidade. Berço

História geral. Berço

Veja outros artigos seção Notas de aula, folhas de dicas.

Leia e escreva útil comentários sobre este artigo.

<< Voltar

Últimas notícias de ciência e tecnologia, nova eletrônica:

A existência de uma regra de entropia para o emaranhamento quântico foi comprovada 09.05.2024

A mecânica quântica continua a nos surpreender com seus fenômenos misteriosos e descobertas inesperadas. Recentemente, Bartosz Regula do Centro RIKEN de Computação Quântica e Ludovico Lamy da Universidade de Amsterdã apresentaram uma nova descoberta que diz respeito ao emaranhamento quântico e sua relação com a entropia. O emaranhamento quântico desempenha um papel importante na moderna ciência e tecnologia da informação quântica. No entanto, a complexidade da sua estrutura torna a sua compreensão e gestão um desafio. A descoberta de Regulus e Lamy mostra que o emaranhamento quântico segue uma regra de entropia semelhante à dos sistemas clássicos. Esta descoberta abre novas perspectivas na ciência e tecnologia da informação quântica, aprofundando a nossa compreensão do emaranhamento quântico e a sua ligação à termodinâmica. Os resultados do estudo indicam a possibilidade de reversibilidade das transformações de emaranhamento, o que poderia simplificar muito seu uso em diversas tecnologias quânticas. Abrindo uma nova regra ... >>

Mini ar condicionado Sony Reon Pocket 5 09.05.2024

O verão é uma época de relaxamento e viagens, mas muitas vezes o calor pode transformar essa época em um tormento insuportável. Conheça um novo produto da Sony – o minicondicionador Reon Pocket 5, que promete deixar o verão mais confortável para seus usuários. A Sony lançou um dispositivo exclusivo - o minicondicionador Reon Pocket 5, que fornece resfriamento corporal em dias quentes. Com ele, os usuários podem desfrutar do frescor a qualquer hora e em qualquer lugar, simplesmente usando-o no pescoço. Este miniar condicionado está equipado com ajuste automático dos modos de operação, além de sensores de temperatura e umidade. Graças a tecnologias inovadoras, o Reon Pocket 5 ajusta o seu funcionamento em função da atividade do utilizador e das condições ambientais. Os usuários podem ajustar facilmente a temperatura usando um aplicativo móvel dedicado conectado via Bluetooth. Além disso, camisetas e shorts especialmente desenhados estão disponíveis para maior comodidade, aos quais um mini ar condicionado pode ser acoplado. O dispositivo pode, oh ... >>

Energia do espaço para Starship 08.05.2024

A produção de energia solar no espaço está se tornando mais viável com o advento de novas tecnologias e o desenvolvimento de programas espaciais. O chefe da startup Virtus Solis compartilhou sua visão de usar a Starship da SpaceX para criar usinas orbitais capazes de abastecer a Terra. A startup Virtus Solis revelou um ambicioso projeto para criar usinas de energia orbitais usando a Starship da SpaceX. Esta ideia poderia mudar significativamente o campo da produção de energia solar, tornando-a mais acessível e barata. O cerne do plano da startup é reduzir o custo de lançamento de satélites ao espaço usando a Starship. Espera-se que este avanço tecnológico torne a produção de energia solar no espaço mais competitiva com as fontes de energia tradicionais. A Virtual Solis planeja construir grandes painéis fotovoltaicos em órbita, usando a Starship para entregar os equipamentos necessários. Contudo, um dos principais desafios ... >>

Notícias aleatórias do Arquivo

A corda da guitarra Nano toca sozinha 22.10.2019

Cientistas da Lancaster University e da Oxford University (Reino Unido) criaram uma "nano-corda" que vibra sem qualquer influência externa. Um fio minúsculo, semelhante a uma corda de violão, pode ser acionado diretamente por uma corrente elétrica.

Para criar o dispositivo, os pesquisadores pegaram um nanotubo de carbono, que é um fio com cerca de três nanômetros de diâmetro, cerca de 100 mil vezes mais fino que uma corda de violão. Eles prenderam a "corda" a suportes de metal em cada extremidade e depois a resfriaram a 000 graus acima do zero absoluto, que é -0,02°C. A parte central do fio estava livre para vibrar, o que os pesquisadores puderam detectar passando uma corrente pelo fio e medindo a mudança na resistência elétrica.

Assim como uma corda de violão vibra quando é tocada, um fio vibra quando uma tensão elétrica é aplicada a ela. Surpreendentemente, quando eles repetiram o experimento sem forças externas, o fio também começou a se mover. A corda "nano-guitarra" tocava sozinha.

Então, que nota a guitarra nano toca? Um nanotubo é muito mais fino que uma corda de violão, por isso vibra em uma frequência muito mais alta - dentro da faixa ultrassônica. Então ninguém pode ouvir. Mas você ainda pode atribuir uma "nota" a esse som. Sua frequência é de 231 milhões de hertz, o que significa que é uma corda A (A) 21 oitavas acima da afinação padrão.

Tal nanostring poderia ser usada para amplificar forças minúsculas, como em novos microscópios, ou para medir a viscosidade de líquidos quânticos exóticos.

Outras notícias interessantes:

▪ Excitons podem aumentar a eficiência energética dos elétrons

▪ Café pode mudar o paladar

▪ Estresse em cães está associado ao estado emocional dos donos

▪ Novo microcontrolador da Maxim

▪ Comunicação óptica de alta velocidade Li-Fi

Feed de notícias de ciência e tecnologia, nova eletrônica

 

Materiais interessantes da Biblioteca Técnica Gratuita:

▪ seção das Instruções de Operação do site. Seleção de artigos

▪ artigo Jogo de um gol. expressão popular

▪ artigo Quantos estados agregados da matéria são conhecidos atualmente? Resposta detalhada

▪ artigo Shandra pente. Lendas, cultivo, métodos de aplicação

▪ artigo Temporizador com desligamento automático e operação com um botão. Enciclopédia de rádio eletrônica e engenharia elétrica

▪ artigo Dispositivo para carregamento rápido de acumuladores. Enciclopédia de rádio eletrônica e engenharia elétrica

Deixe seu comentário neste artigo:

Имя:


E-mail opcional):


Comentário:





Todos os idiomas desta página

Página principal | Biblioteca | Artigos | Mapa do Site | Revisões do site

www.diagrama.com.ua

www.diagrama.com.ua
2000-2024