Array
(
)

Alternativa para o overload

Socram
   - 04 nov 2009

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

Anderson Farias
   - 04 nov 2009

|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+

0
|
0

Socram
   - 04 nov 2009

| 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.

0
|
0

Anderson Farias
   - 04 nov 2009

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+

0
|
0

Socram
   - 05 nov 2009

Blz amigo.

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

Obrigado. 

0
|
0

Socram
   - 05 nov 2009

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.

0
|
0

Jorge Abreu
   - 07 nov 2009

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: #Código

  class function ExtrairAno(aDate:TDateTime):integer; overload;
  class function ExtrairAno(aDate:TDateTime):string; overload;

0
|
0

Anderson Farias
   - 07 nov 2009

|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+

0
|
0

Jorge Abreu
   - 08 nov 2009

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

0
|
0

Socram
   - 09 nov 2009

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+

0
|
0