Alternativa para o overload

04/11/2009

0

Pessoal
tenho a seguinte situação na minha lib

  TDateGen = class
  public
    class function ExtrairAno(aDate:TDateTime):integer;
    class function ExtrairMes(aDate:TDateTime):integer;
    class function ExtrairDia(aDate:TDateTime):integer;
  end;

Fiz isso usando o DecodeDate, mas separei em funções assim para não ter que ficar criando toda vez as variaveis e tudo mais.

Bom vamos ao meu problema.
Gostaria de criar tbm as seguintes funções
    class function ExtrairAno(aDate:TDateTime):string;
    class function ExtrairMes(aDate:TDateTime):string;
    class function ExtrairDia(aDate:TDateTime):string;

Pois tenho caso em que preciso escrever o retorno, e para não ter que ficar fazendo o IntToStr toda hora no código.

como usaria isso.
var
  mes :integer;
begin
  mes := ExtrairMes(now); //(aqui ele chamaria a função com o result integer, se a variavel fosse string, ele chamaria a função com result string;

Tem como fazer isso?
Quais são as alternativas?

Obrigado
Marcos Iwazaki

Marcos Iwazaki

Responder

Posts

04/11/2009

Anderson Farias

|Fiz isso usando o DecodeDate, mas separei em funções assim para

|não ter que ficar criando toda vez as variaveis e tudo mais.



Pq? As funções DayOf(), MonthOf() e YearOf() não já fazem isso? Pq não usá-las?





|Bom vamos ao meu problema.

|Gostaria de criar tbm as seguintes funções

|    class function ExtrairAno(aDate:TDateTime):string;

|...



Uma solução simples? Mude o nome das funções! tipo: ExtrairAnoToS(), etc





T+
Responder

04/11/2009

Marcos Iwazaki

| Pq? As funções DayOf(), MonthOf() e YearOf() não já fazem isso? Pq não usá-las?
Não lembrava dessas funções, bom como estão todos separados em funções vou alterar la. Obrigado.

|Uma solução simples? Mude o nome das funções! tipo: ExtrairAnoToS(), etc
Então o que eu quero mesmo era poder usar o mesmo nome, Usar algum tipo de desing Pattern (não sei se existe para este problema).
Mas vou anotar sua sugestão... Mesmo que não consiga fazer exatamente o que eu quero é bom ter sugestões de como chegar no mesmo resultado.

Obrigado.
Responder

04/11/2009

Anderson Farias

A única forma de usar o mesmo nome, q eu saiba, é se vc usar procedimentos no lugar de funções. Assim a assinatura passa a ser diferente, o q é um requisito para o overload. Ex:

class procedure ExtrairAno(Data: TDateTime; var Ano: Integer); overload;
class procedure ExtrairAno(Data: TDateTime; var Ano: string); overload;


e dai usar da forma:

var
  i: Integer;
  s: string;
begin

  MinhaClasse.ExtrairAno(Date, i);
  MinhaClasse.ExtrairAno(Date, s);

end;


T+
Responder

05/11/2009

Marcos Iwazaki

Blz amigo.

Acho que procedimentos para mim vai ficar pior. Vou criar outras functions mesmo.

Obrigado. 
Responder

05/11/2009

Marcos Iwazaki

Fiz o ultimo post pelo chrome e não apareceu a janela de finalizar o topico.
Estou tentando novamente pelo firefox p ver se aparece.
Responder

07/11/2009

Jorge Abreu

Boa tarde a todos. Bom, como deixei de programar em delphi há mais de dois anos, para programar em java, porém quando programava em Delphi 2007, voce podia também fazer não só o Overload (Sobrecarga) como também o Override (Sobrescrita) de functions. Não sei se isto vai funcionar nas versões atuais do Delphi, porém não custa nada tentar:
  class function ExtrairAno(aDate:TDateTime):integer; overload;
  class function ExtrairAno(aDate:TDateTime):string; overload;
Responder

07/11/2009

Anderson Farias

|porém quando programava em Delphi 2007, voce podia também fazer não só o Overload
|(Sobrecarga) como também o Override (Sobrescrita) de functions.

Sim, o Delphi suporta sobrecarga, mas o pré-requisito para sobrecarga é que os métodos tenham *assinatura* diferente.

No caso de funções, o tipo retornado pela função não faz parte da assinatura do método e assim, mudar apenas o retorno da função e manter a mesma assinatura (parâmetros) não permite a sobrecarga. Por isso q uma solução é converter a função em procedimento fazendo assim q o valor de retorno passe a integrar a assinatura do método.

É assim no D7 e, até onde sei, continua assim até o D2010.


T+
Responder

08/11/2009

Jorge Abreu

Boa tarde a todos. É verdade, havia me esquecido disto, e que não era para esquecer, pois no Java funciona de forma semelhante.   Neste caso, uma solução que traria ao nosso Marcos, seria declarar um dos parâmetros aDate de uma das funções como String, pois eu acho melhor voce tratar data como String para fazer o que ele pretende, ou seja extrair ano, dia, mes, pois assim permite voce utilizar a função copy. Vejamos o código abaixo.     Isto é só uma sugestão
Responder

09/11/2009

Marcos Iwazaki

Obrigado pela ajuda o pessoal que respondeu.

Vou decidir ainda como vou fazer, mas acho que pelo jeito vou acabar optando pelo modo de criar outro nome p o metodo

ExtrairAnoString

T+
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar