Delphi para Java

Olá a todos.

Estou começando a estudar Java e estou me sentindo meio perdido. Depois de 10 anos programando em Delphi fica complicado querer fazer tudo de uma vez em uma nova linguagem. Acontece que tenho um pequeno aplicativo em Delphi utilizando alguns dos vários recursos de OO que não estou conseguindo reescrever em Java. Espero que possam me ajudar.

Vou escrever aqui os meus métodos em Delphi e gostaria se possível que alguem conseguisse converter esse código em Java pra mim. Para entender é fácil mas pra converter é que é o complicado. Desde já agradeço.

TPersistente = class
public
   function Persistir: Boolean; virtual; abstract;
   class function Obter(pID: Integer): TPersistente; virtual; abstract;
   class function ObterTodos: TList; virtual; abstract;
   funciton Destruir(pID: Integer): Boolean; virtual; abstract;
end;

Bom, essa primeira classe é a minha classe base, várias outras classes irão descender dela e reescrever os métodos. Já vi que no java não existe virtual, apenas abstract.

TDepartamento = class
end;

Não preciso entrar em detalhe dessa segunda classe pois não me está atrabalhando… O problema vai vir agora que vou herdar minha terceira classe da primeira.

TDepartamentoDAO = class(TPersistente)
public
   function Persistir(pDepartamento: TDepartamento); Boolean; reintroduce; overload;
   class function Obter(pID: Integer); TDepartamento; reintroduce; overload;
   class function ObterTodos: TList; override;
   function Destruir(pID: Integer); Boolean; override;
end;

  • O primeiro método altera a assinatura do seu referente na primeira classe;
  • O segundo método altera o retorno do seu referente na primeira classe;

E é nisso aí que mora o meu problema. Eu já tentei de umas 10 maneira diferentes reescrever isso em Java mas não obtive sucesso. :frowning:

Eu sei que ninguém aqui está para converter código pro outro. Mas isso já vai ser de grande ajuda para mim.

Muito obrigado mesmo.

Best regard’s. :smiley:

O que vc quer nesse primeiro exemplo pode sewr chamado de INTERFACE em java, de uma pesquisada sobre isso mas o código ficaria +/- assim:

public interface TPersistente{
 //declare o nome dos seus métodos aqui
}

ja na classe que vc quer utilizar esses métodos vc declara

public class Teste implements TPersistente{
blablabla
}

Acho que com isso vc consegue quebrar um pouco a cabeça, desculpa se tiver algum erro mais to meio corrido aqui pra compilar o código rsrsrsr.

Flw

Olá

Algumas considerações:

  • em Java, não há diferença entre function e procedure: é tudo método;
  • class functions ( ou class procedures ) são equivalentes a métodos estáticos em Java ( declarados com a palavra-chave static );
  • em Java não é necessário declarar que você está sobrecarregando/sobreescrevendo um método; simplesmente sobrecarrege/sobrescreva;
  • para quê alterar a assinatura nas implementações de TPersistence? Por que não deixar os métodos de TPersistence com as mesmas assinaturas?

Vamos chegar a um consenso quando a essa sua classe TPersistence para começarmos a converter o código.

Abraços

Lembrando que em Delphi também há interfaces. TPersistence é uma classe abstrata.

Minha classe persistente como disse vai ser minha classe base.

Além da minha classe TDepartamentoDAO, ainda vou ter outras como por exemplo TFuncionarioDAO.

No caso de TDeparmentoDAO:
TDepartamentoDAO = class(TPersistente)
public
function Persistir(pDepartamento: TDepartamento); Boolean; reintroduce; overload;
class function Obter(pID: Integer); TDepartamento; reintroduce; overload;
class function ObterTodos: TList; override;
function Destruir(pID: Integer); Boolean; override;
end;

No caso de TFuncionarioDAO:
TFuncionarioDAO = class(TPersistente)
public
function Persistir(pFuncionario: TFuncionario); Boolean; reintroduce; overload;
class function Obter(pID: Integer); TFuncionario; reintroduce; overload;
class function ObterTodos: TList; override;
function Destruir(pID: Integer); Boolean; override;
end;

No Delphi o modificador class function é a mesma coisa que o static do Java. Ou seja, não preciso instanciar um objeto TDepartamentoDAO ou TFuncionarioDAO para acessar os métodos Obter e ObterTodos.

Ambas as classes precisam implementar os quatro métodos da classe base TPersistente. Isso é minha garantia de que todos as classes vão escrever os métodos que eu preciso.

Método Persistir

  • Recebe uma classe distinta, TDepartamento ou TFuncionario e faz um insert ou update no banco com as informações que cada uma dela possui, ex. código e descrição/nome funcionário.

Método Obter

  • Efetua um select no banco de dados para retornar um objeto com as características que foi passado no parametro pID.

Método ObterTodos

  • Efetua um select no banco de dados e retorna um TList com tantos quantos objetos referentes ao registros que foram encontrados no bando de dados, ou de departamento ou de funcionário.

Método Destruir

  • Retira um registro do banco de dados baseado o ID informado.

Dê uma pesquisada em Generics, vai te ajudar no que você está tentando fazer.

Mas lembre-se que cada linguagem tem as suas particularidades e a melhor forma de se fazer algo em uma linguagem pode não ser a melhor em outra.

Boa sorte.

Sugiro que repense seu problema utilizando Java, ao invés de tentar traduzir códigos do Delphi pro Java.

Senão vc vai continuar programando em Delphi, mas usando uma linguagem diferente.

Sempre procuro fazer isso, qdo aprendo uma linguagem/framework nova. Tento pensar em outra forma de solucionar meu problema, e como a nova tecnologia pode me ajudar nisso.

abraço!

Entendo. Você declarou dessa forma porque você sempre sobrescreverá os métodos, uma vez que os parâmetros serão redefinidos para a entidade que seu DAO persistirá.

Me diga uma coisa: você tem algum código IMPLEMENTADO de fato na sua classe TPersistence? Ou todos os métodos são abstratos?

Se não tiver, qual o motivo de você declarar métodos de busca como estáticos e métodos de persistência como de instância? Ou deixa tudo estático ou não.

Se você optar por eliminar os métodos estáticos, uma interface pode ser declarada ( pegando o gancho do nosso colega Guitar_Men ):

public interface Persistence<T> { boolean persist(T t); T get(int id); List<T> getAll(); boolean delete(T t); }

Como eu disse antes, essa interface pode ser declarada no Delphi também ( exceto pelo uso de Generics ).

No mais, como os colegas falaram, não é tão simples “traduzir” um programa de uma linguagem para outra. Em Java, por exemplo, a utilização de Generics facilita muita coisa.

tnaires até dá pra seguir a sugestão de deixar tudo estático ou não. Mas mesmo assim, eu continuo com o problema de troca de assinatura dos métodos. O Java não me deixa trocar a assinatura e muito menos o retorno de uma função pelo meios que eu estudei até agora. E eu sei, como o rafagil escreveu, que preciso pensar em Java em vez de traduzir o código Delphi. Porém como eu sou novo em Java, não sei quais os recursos que a linguagem me oferece para que eu possa fazer o que eu faço com o Delphi de uma forma menos traumática :lol:

Eu tentei de todas as formas fazer com que:

TPersistente = class
public
  function Persistir: Boolean; virtual; abstract;
end;

Na herança se tornasse:

TDepartamentoDAO = class(TPersistente)
public
  function Persistir(pDepartamento: TDepartamento): Boolean; reintroduce; overload;
end;

Tá vendo? O método mudou a assinatura, mas continua o mesmo método. E eu não consegui fazer essa simples coisa. :frowning:

O que você quer é um reintroduce, mas em Java não tem isso.
Você precisa sobrescrever o método abstrato “persistir” que você declarou na classe mãe, e depois escrever uma sobrecarga para ele.
Exemplo:[code]public abstract class Persistence {
abstract boolean persistir();
}

public class DepartamentoDAO extends Persistence {
public boolean persistir() {
// O método declarado na classe mãe
}

public boolean persistir(Departamento d) {
    // A sobrecarga do método
}

}[/code]Em Java, você não precisa declarar as funções duas vezes. Veja que também não faz parte das convenções de código iniciar uma classe em Java com “T” ( que vem de type, do Pascal ).

tnaires obrigado… eu até tinha pensado em fazer isso mesmo… mas pensei que dava pra fazer de outra forma… Mais uma vez obrigado.

E não tem como eu deixar a definição da classe herdada “escondida”?

Ou seja, quando eu tiver escrevendo minha aplicação e necessitar utilizar a classe DepartamentoDAO só apareça para mim o método persistir que aceita o parâmetro Departamento p. Que não mostre que a sobrecarga do método.

[quote=romulojn]tnaires obrigado… eu até tinha pensado em fazer isso mesmo… mas pensei que dava pra fazer de outra forma… Mais uma vez obrigado.

E não tem como eu deixar a definição da classe herdada “escondida”?

Ou seja, quando eu tiver escrevendo minha aplicação e necessitar utilizar a classe DepartamentoDAO só apareça para mim o método persistir que aceita o parâmetro Departamento p. Que não mostre que a sobrecarga do método.[/quote]
Mas aí é que tá… Você vai usar essa implementação da classe mãe em alguma especialização? Senão, por que esse método tá aí? Só pra servir de sobrecarga?
É melhor você escrever uma forma genérica do método “persistir” na classe abstrata, que recebe um Object ou um tipo genérico ( é melhor você começar a estudar generics ).
E volto a insistir: use uma interface, porque pelo jeito sua classe mãe não tem nenhuma implementação que poderá ser útil para suas filhas.

Abraços

Tutorial de generics da Sun:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf