Funções e procedimentos são uma parte importante da linguagem Delphi. A partir do Delphi 4, o Delphi nos permite trabalhar com funções e procedimentos que suportam parâmetros padrão (tornando o parâmetros opcionais) e permite que duas ou mais rotinas tenham um nome idêntico, mas operem como completamente diferentes rotinas.
Vamos ver como a sobrecarga e os parâmetros padrão podem ajudá-lo a codificar melhor.
Sobrecarga
Simplificando, a sobrecarga está declarando mais de uma rotina com o mesmo nome. A sobrecarga nos permite ter várias rotinas que compartilham o mesmo nome, mas com um número diferente de parâmetros e tipos.
Como exemplo, vamos considerar as duas funções a seguir:
{Rotinas sobrecarregadas devem ser declaradas. com a diretiva sobrecarga}função SumAsStr (a, b: número inteiro): corda; sobrecarga; início Resultado: = IntToStr (a + b); fim; função SumAsStr (a, b: estendido; Dígitos: número inteiro): corda; sobrecarga; início Resultado: = FloatToStrF (a + b, ffFixed, 18, Digits); fim;
Essas declarações criam duas funções, ambas chamadas SumAsStr, que usam um número diferente de parâmetros e são de dois tipos diferentes. Quando chamamos uma rotina sobrecarregada, o compilador deve ser capaz de dizer para qual rotina queremos chamar.
Por exemplo, SumAsStr (6, 3) chama a primeira função SumAsStr, porque seus argumentos têm valor inteiro.
Nota: O Delphi irá ajudá-lo a escolher a implementação correta, com a ajuda do preenchimento e do insight do código.
Por outro lado, considere se tentarmos chamar a função SumAsStr da seguinte maneira:
SomeString: = SumAsStr (6.0,3.0)
Iremos receber um erro que diz: "não existe uma versão sobrecarregada de 'SumAsStr' que possa ser chamada com esses argumentos."Isso significa que também devemos incluir o parâmetro Digits usado para especificar o número de dígitos após o ponto decimal.
Nota: Há apenas uma regra ao escrever rotinas sobrecarregadas, e isso é que uma rotina sobrecarregada deve diferir em pelo menos um tipo de parâmetro. O tipo de retorno, em vez disso, não pode ser usado para distinguir entre duas rotinas.
Duas unidades - uma rotina
Digamos que temos uma rotina na unidade A e a unidade B usa a unidade A, mas declara uma rotina com o mesmo nome. A declaração na unidade B não precisa da diretiva de sobrecarga - devemos usar o nome da unidade A para qualificar as chamadas para a versão A da rotina da unidade B.
Considere algo como isto:
unidade B;... usa UMA;... procedimento RoutineName; início Resultado: = A.RoutineName; fim;
Uma alternativa ao uso de rotinas sobrecarregadas é usar parâmetros padrão, que geralmente resultam em menos código para gravar e manter.
Parâmetros padrão / opcionais
Para simplificar algumas instruções, podemos fornecer um valor padrão para o parâmetro de uma função ou procedimento, e podemos chamar a rotina com ou sem o parâmetro, tornando-o opcional. Para fornecer um valor padrão, finalize a declaração do parâmetro com o símbolo igual (=) seguido por uma expressão constante.
Por exemplo, dada a declaração
função SumAsStr (a, b: estendido; Dígitos: número inteiro = 2): corda;
as seguintes chamadas de função são equivalentes.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Nota: Parâmetros com valores padrão devem ocorrer no final da lista de parâmetros e devem ser passados por valor ou como const. Um parâmetro de referência (var) não pode ter um valor padrão.
Ao chamar rotinas com mais de um parâmetro padrão, não podemos pular parâmetros (como no VB):
função SkipDefParams (var Uma linha; B: inteiro = 5, C: booleano = Falso): booleano;... // esta chamada gera uma mensagem de erro
CantBe: = SkipDefParams ('delphi'; True);
Sobrecarga com parâmetros padrão
Ao usar sobrecarga de função ou procedimento e parâmetros padrão, não introduza declarações de rotina ambíguas.
Considere as seguintes declarações:
procedimento DoIt (A: estendido; B: inteiro = 0); sobrecarga; procedimento DoIt (A: estendido); sobrecarga;
A chamada para o procedimento DoIt, como DoIt (5.0), não é compilado. Por causa do parâmetro padrão no primeiro procedimento, essa instrução pode chamar os dois procedimentos, porque é impossível dizer qual procedimento deve ser chamado.