Alguém aqui usa Lazarus?

[quote]public interface Lutador { public boolean estaVivo(); public int forcaDeAtaque(); public String nome(); public int numeroDeVidasAtual(); public void registrarObservador(ObservadorDaLuta observador); } ... public class Inimigo implements Lutador { ... }[/quote]

no pascal é assim:

[code]
type
Lutador = interface
public
function estaVivo : boolean;
function forcaDeAtaque : Integer;
function nome : string;
function numeroDeVidasAtual : Integer;
procedure registrarObservador(observador : ObservadorDaLuta);
end;

Inimigo = class(Lutador)

end;[/code]

qual a diferença?

posta um exemplo completo.

[quote=juliocbq][quote=x@ndy][quote=juliocbq][quote=x@ndy][quote=juliocbq][quote=x@ndy][quote=juliocbq]
Você tem razão, quem implementa é esse: TInterfacedObject(de acordo com a documentação).

dessa maneira vai criar uma hierarquia consistente.[/quote]

Na verdade também não. Você não pode chamar o método Free de uma classe descendente de TInterfacedObject. Se fizer isso vai ser levantada uma exceção![/quote]

Claro que não, ela já implementa um smart pointer. Você não precisa usar free explicitamente.[/quote]

Não entendi como isso funciona, poderia me explicar?[/quote]

Porque essa classe já implementa reference count.
http://www.freepascal.org/docs-html/rtl/system/tinterfacedobject.html[/quote]
Ah sim! Mas isso cria um outro problema: http://br.groups.yahoo.com/group/delphi-br/message/196124[/quote]

É justamente o que o link que você postou disse. Se você já tem o smart pointer não precisa gerenciar memória manualmente para não causar confusão.[/quote]
O problema é a confusão que isso gera e o cuidado que devo ter para evitar esse tipo de problema.
O que o java faz é justamente tirar isso do ombro do programador.

[quote=GilsonNunes][quote]public interface Lutador { public boolean estaVivo(); public int forcaDeAtaque(); public String nome(); public int numeroDeVidasAtual(); public void registrarObservador(ObservadorDaLuta observador); } ... public class Inimigo implements Lutador { ... }[/quote]

no pascal é assim:

type
   Lutador = interface
    public
      function estaVivo : boolean;
      function forcaDeAtaque : Integer;
      function nome : string;
      function numeroDeVidasAtual : Integer;
      procedure registrarObservador(observador : ObservadorDaLuta);
  end;

  Inimigo = class(Lutador)
    ...
  end;[/code]

qual a diferença?

posta um exemplo completo.[/quote]
Bom seu exemplo está errado, exatamente aqui: [b]Inimigo = class(Lutador)[/b]. O exemplo completo esta abaixo:

[code]public interface Lutador {
	public boolean estaVivo();
	public int forcaDeAtaque();
	public String nome();
	public int numeroDeVidasAtual();
	public void registrarObservador(ObservadorDaLuta observador);
}[/code]
[code]package dominio;



import dominio.tesouros.*;
import dominio.utensilios.*;

public class Jogador implements Lutador {
	private int numeroDeVidas;
	private Arma arma = new Arma(TipoDeArma.FACA);
	private Tesouro tesouro = null;
	private Armadura armadura = new Armadura(TipoDeArmadura.NENHUMA);
	private String nome;
	private ObservadorDaLuta observador;
	private EstrategiaDeCombate estrategiaDeCombate;
	public final int efetividadeDoGolpe = 80;

	private void reiniciarNumeroDeVidas(){
		numeroDeVidas = 10;
	}

	private void levantarExcecaoParametroNulo(Object parametro, String nomeDoParametro){
		if (parametro == null){
			String mensagem = String.format("O parâmetro '%s' não pode ser nulo!", nomeDoParametro);
			throw new IllegalArgumentException(mensagem);
		}
	}

	public Jogador(String nome) {
		levantarExcecaoParametroNulo(nome, "nome");

		if (nome.trim().equals(""))
			throw new IllegalArgumentException("O campo nome não pode ser nulo");
		this.nome = nome;
		reiniciarNumeroDeVidas();
	}

	public void beberPocaoDeVida(){
		if (tesouro instanceof PocaoDeVida){
			reiniciarNumeroDeVidas();
			tesouro = null;
		}
	}

	public void golpeRecebido(Inimigo inimigo, Golpe golpe){
		levantarExcecaoParametroNulo(inimigo, "inimigo");
		levantarExcecaoParametroNulo(golpe, "golpe");
		int danoCausado = golpe.danoQueCausa() - armadura.tipo().nivelDeProtecao();

		if (danoCausado < 0)
			danoCausado = 0;
		numeroDeVidas -= danoCausado; 

		if (observador != null)
			observador.notificarContraAtaqueRecebido(inimigo, golpe, danoCausado);
	}

	public void golpear(Inimigo inimigo) throws ExcecaoEstrategiaNaoDefinida{
		levantarExcecaoParametroNulo(inimigo, "inimigo");

		if (!estaVivo())
			throw new IllegalStateException("Operação illegal quando se está morto");

		if (estrategiaDeCombate == null)
			throw new ExcecaoEstrategiaNaoDefinida();

		Golpe golpe = estrategiaDeCombate.gerarGolpe(this);
		inimigo.golpeadoPor(this, golpe);
	}

	public void definirEstrategiaDeCombate(EstrategiaDeCombate estrategia){
		levantarExcecaoParametroNulo(estrategia, "estrategia");
		estrategiaDeCombate = estrategia;		
	}

	public Arma arma(){
		return arma;
	}

	public Arma segurarArma(Arma arma){
		levantarExcecaoParametroNulo(arma, "arma");
		Arma armaParaSoltar;

		if (arma.tipo().danosQueElaCausa() > this.arma.tipo().danosQueElaCausa()){
			armaParaSoltar = this.arma;
			this.arma = arma;
		}
		else
			armaParaSoltar = arma;

		return armaParaSoltar;
	}

	public Armadura vestirArmadura(Armadura armadura){
		levantarExcecaoParametroNulo(armadura, "armadura");

		Armadura armaduraRetirada;

		if (armadura.tipo().nivelDeProtecao() > this.armadura.tipo().nivelDeProtecao()){
			armaduraRetirada = this.armadura;
			this.armadura = armadura;
		}

		else
			armaduraRetirada = armadura;

		return armaduraRetirada;
	}

	@Override

	public boolean estaVivo() {
		return (numeroDeVidas > 0);
	}

	@Override
	public int forcaDeAtaque() {
		return 2 + arma.tipo().danosQueElaCausa();
	}

	@Override
	public String nome() {
		return nome;
	}

	@Override
	public int numeroDeVidasAtual() {
		return numeroDeVidas;
	}

	@Override
	public void registrarObservador(ObservadorDaLuta observador) {
		if (observador == null)
			throw new IllegalArgumentException("O parâmetro 'observador' não pode ser nulo!");
		this.observador = observador;		
	}

	public Tesouro tesouro(){
		return tesouro;
	}

	public Tesouro segurarTesouro(Tesouro tesouro) {
		levantarExcecaoParametroNulo(tesouro, "pocaoDeVida");
		Tesouro tesouroAtual = this.tesouro;
		this.tesouro = tesouro;
		return tesouroAtual;
	}
}

[code]public abstract class Inimigo implements Lutador {

private ObservadorDaLuta observador;
private final int efetividadeDoGolpe = 50;

protected static final Random random = new Random();

protected abstract void definirNumeroDeVida(int numeroDeVidas);
	
protected void revidarGolpe(Jogador jogador){
	jogador.golpeRecebido(this, new Golpe(forcaDeAtaque(), "nenhum", efetividadeDoGolpe));
}

public void golpeadoPor(Jogador jogador, Golpe golpe){
	if (jogador == null)
		throw new IllegalArgumentException("O parâmetro 'jogador' não pode ser nulo!");
	if (golpe == null)
		throw new IllegalArgumentException("O parâmetro 'golpe' não pode ser nulo!");
	
	int numeroDeVidas = numeroDeVidasAtual() - golpe.danoQueCausa();
	
	definirNumeroDeVida(numeroDeVidas);
	
	if (observador != null)
		observador.notificarAtaqueRecebido(jogador, golpe, golpe.danoQueCausa());
	
	if (estaVivo()) 
		revidarGolpe(jogador);
}

public void registrarObservador(ObservadorDaLuta observador){
	if (observador == null)
		throw new IllegalArgumentException("O parâmetro 'observador' não pode ser nulo!");
	this.observador = observador;		
}

@Override
public boolean estaVivo() {
	return numeroDeVidasAtual() > 0;
}

}
[/code]

[quote=x@ndy]
O problema é a confusão que isso gera e o cuidado que devo ter para evitar esse tipo de problema.
O que o java faz é justamente tirar isso do ombro do programador.[/quote]

Não existe confusão nenhuma. O grande problema é o estudo. Quando você sabe o que fazer a tarefa é simples.
O fato é que usar java com essas tarefas implícitas acaba nos tornando muito preguiçosos. Eu mesmo já percebi isso, já que uso java profissionalmente. Quando trabalhava com pascal nem sentia o peso dessas tarefas.

[quote=GilsonNunes]
o cara ai do tal link ta tendo problema pq ele usa o q conta referencia e trata como se não fosse. (é o tipico despreparado)[/quote]
Boa a sua colocação, então qual o nivel do programador que eu tenho que ter para trabalhar com OO no delphi, para evitar esse tipo de problema?
Lembro que em uma equipe existem programadores de diversos niveis, como evitar esse tipo de problema?

[quote=juliocbq][quote=x@ndy]
O problema é a confusão que isso gera e o cuidado que devo ter para evitar esse tipo de problema.
O que o java faz é justamente tirar isso do ombro do programador.[/quote]

Não existe confusão nenhuma. O grande problema é o estudo. Quando você sabe o que fazer a tarefa é simples.
O fato é que usar java com essas tarefas implícitas acaba nos tornando muito preguiçosos. Eu mesmo já percebi isso, já que uso java profissionalmente. Quando trabalhava com pascal nem sentia o peso dessas tarefas.[/quote]

Cara, não chamaria de preguiça, sinceramente eu prefiro não me preocupar com isso. Se for preguiça, daqui a pouco todos os programadores que não programam em C são preguiçosos.
Acho que isso é mais uma vantagem da linguagem que qualquer outra coisa.

A confusão a que me refiro é quando você trabalha em equipe. Se você trabalha solo, blz, mas numa equipe nem sempre todos os programadores estão no mesmo nível. Você até pode saber o que está fazendo, mas e os outros da sua equipe. Isso que me refiro quando digo que gera confusão. Se eu implementei não posso ficar confuso né. Agora e os outros membros da equipe estão no mesmo nivel de conhecimento do meu?

O java tirando isso dos ombros do programador facilita enormemente o trabalho. Como disse antes da para trabalhar com OO no Delphi, mas isso mais cuidado que no Java. É claro que com o tempo e experiência isso vai no automático, mas mesmo assim requer mais experiência do que eu teria para fazer em java.

[quote=x@ndy][quote=GilsonNunes]
o cara ai do tal link ta tendo problema pq ele usa o q conta referencia e trata como se não fosse. (é o tipico despreparado)[/quote]
Boa a sua colocação, então qual o nivel do programador que eu tenho que ter para trabalhar com OO no delphi, para evitar esse tipo de problema?
Lembro que em uma equipe existem programadores de diversos niveis, como evitar esse tipo de problema?[/quote]

Precisa do nível que saiba o básico do desenvolvimento de software. Porque o profissional que não conhece o que é um apontador e que objetos e estruturas primitivas são alocadas em memória não é profissional.
Você colocou aí um ítem muito importante. As escolas ensinam pascal e c nas universidades para que tenham contato com um ambiente computacional real, não um virtual.

Por isso eu sou contra o ensino java inicialmente numa cadeira de computação.

[quote=x@ndy][quote=juliocbq][quote=x@ndy]
O problema é a confusão que isso gera e o cuidado que devo ter para evitar esse tipo de problema.
O que o java faz é justamente tirar isso do ombro do programador.[/quote]

Não existe confusão nenhuma. O grande problema é o estudo. Quando você sabe o que fazer a tarefa é simples.
O fato é que usar java com essas tarefas implícitas acaba nos tornando muito preguiçosos. Eu mesmo já percebi isso, já que uso java profissionalmente. Quando trabalhava com pascal nem sentia o peso dessas tarefas.[/quote]

Cara, não chamaria de preguiça, sinceramente eu prefiro não me preocupar com isso. Se for preguiça, daqui a pouco todos os programadores que não programam em C são preguiçosos.
Acho que isso é mais uma vantagem da linguagem que qualquer outra coisa.

A confusão a que me refiro é quando você trabalha em equipe. Se você trabalha solo, blz, mas numa equipe nem sempre todos os programadores estão no mesmo nível. Você até pode saber o que está fazendo, mas e os outros da sua equipe. Isso que me refiro quando digo que gera confusão. Se eu implementei não posso ficar confuso né. Agora e os outros membros da equipe estão no mesmo nivel de conhecimento do meu?

O java tirando isso dos ombros do programador facilita enormemente o trabalho. Como disse antes da para trabalhar com OO no Delphi, mas isso mais cuidado que no Java. É claro que com o tempo e experiência isso vai no automático, mas mesmo assim requer mais experiência do que eu teria para fazer em java.[/quote]

Você colocou algo importante. Mas é o que eu respondi no meu post anterior. É implicito que um profissional saiba isso. Matéria de escola em estrutura de dados.
Creio que vira preguiça sim. O fato é que ambiente virtual deve ser visto como uma ferramente, não como algo genérico para que não haja alienação.

[quote=juliocbq]
Para criar software bem modelado não é necessário usar uma linguagem como java. Nem de longe java facilita nesse quesito. Existem implementações em c++ e pascal que dão um banho em muitas que são produzidas em linguagens modernas. Um exemplo disso é o proprio qt. Totalmente MVC.
Para construir software bom você tem que saber o que faz com as ferramentas que utiliza.[/quote]
Concordo com você, mas o ponto que estou colocando é a facilidade de se implementar. Na verdade a facilidade de se programar usando OO no Delphi e no Java.
No Delphi é possivel sim se criar um sistema OO, mas não é mais fácil fazer isso no Java?
As referencias a objetos e o uso de interfaces são, a meu ver, os maiores problemas, a serem contornados no POO no delphi. Isso exige um conhecimento que a maioria dos programadores não tem!
Assim como se eu quero implementar um sistema DBware, é muito mais fácil fazer isso em Java, do que no Delphi (não estou discutindo se DBware é melhor ou pior do que OO)

[quote=juliocbq]
Você colocou algo importante. Mas é o que eu respondi no meu post anterior. É implicito que um profissional saiba isso. Matéria de escola em estrutura de dados.
Creio que vira preguiça sim. O fato é que ambiente virtual deve ser visto como uma ferramente, não como algo genérico para que não haja alienação.[/quote]

Ai que tá, eu aprendi isso na marra, não tive isso em Estrutura de Dados I e II! Mas não quero discutir a falta ou não do conhecimento! O que coloco são as dificuldades de desenvolver usando OO no Delphi ou em outra linguagem que use GC.
Para mim as linguagens são como ferramentas e assim como as ferramentas ela evoluem para facilitar a vida do desenvolvedor. Novas ferramentas trazem novas facilidades e as tornas mais produtivas que as antigas. Isso faz com que possa me preocupar mais com o dominio do meu problema do que com as dificuldades da linguagem.

[quote=x@ndy][quote=juliocbq]
Para criar software bem modelado não é necessário usar uma linguagem como java. Nem de longe java facilita nesse quesito. Existem implementações em c++ e pascal que dão um banho em muitas que são produzidas em linguagens modernas. Um exemplo disso é o proprio qt. Totalmente MVC.
Para construir software bom você tem que saber o que faz com as ferramentas que utiliza.[/quote]
Concordo com você, mas o ponto que estou colocando é a facilidade de se implementar. Na verdade a facilidade de se programar usando OO no Delphi e no Java.
No Delphi é possivel sim se criar um sistema OO, mas não é mais fácil fazer isso no Java?
As referencias a objetos e o uso de interfaces são, a meu ver, os maiores problemas, a serem contornados no POO no delphi. Isso exige um conhecimento que a maioria dos programadores não tem!
Assim como se eu quero implementar um sistema DBware, é muito mais fácil fazer isso em Java, do que no Delphi (não estou discutindo se DBware é melhor ou pior do que OO)
[/quote]

Não é mais fácil nem mais difícil, é a questão do conhecimento. Tem dois engenheiros que trabalham juntamente comigo aqui. Programam em assembly com facilidade de quem programa com java.
Se você sabe usar a ferramenta fica simples.

Boa colocação. Como eu sempre digo a ferramenta certa para o problema certo. Manda eles modelarem um sistema que usando OO daria uma dezena de classes em assembly. :smiley:
Vai ser mais “dificil” fazer em qual linguagem? Em qual vai ficar mais pronta mais rápido? Por que tudo que vocẽs tem ai não é feito em assembly?

Como você colocou, você programa em java ai. Então existe problemas ai que não podem ser resolvidos com assembly não é? Ou até podem, mas o trabalho seria infinitamente maior não?
Não estou colocando dificuldade como falta de conhecimento, mas dificulade de usar uma ferramenta quando ela não a é a ideal para o seu projeto.

a mesma coisa em pascal:

type Lutador = interface function estaVivo : boolean; function forcaDeAtaque : Integer; function nome : string; function numeroDeVidasAtual : Integer; procedure registrarObservador(observador : ObservadorDaLuta); end;

[code]unit uJogador;

interface

uses
uLutador, Classes, SysUtils;

type
Jogador = class(TInterfacedPersistent, Lutador)
private
numeroDeVidas : Integer;
fArma : TArma;
fTesouro : TTesouro;
armadura : TArmadura;
Fnome : string;
observador : ObservadorDaLuta;
estrategiaDeCombate : TEstrategiaDeCombate;
public
const efetividadeDoGolpe = 80;
private
procedure reiniciarNumeroDeVidas;
procedure levantarExcecaoParametroNulo(parametro : TObject; nomeDoParametro : string);
public
constructor Create(nome : string); reintroduce;
destructor Destroy; override;
procedure beberPocaoDeVida;
procedure golpeRecebido(inimigo : TInimigo; golpe : TGolpe);
procedure golpear(inimigo : TInimigo);
procedure definirEstrategiaDeCombate(estrategia : EstrategiaDeCombate);
function segurarArma(arma : TArma) : TArma;
function vestirArmadura(armadura : TArmadura) : TArmadura;
public
function estaVivo: Boolean;
function forcaDeAtaque: Integer;
function nome: string;
function numeroDeVidasAtual: Integer;
procedure registrarObservador(observador: TObject);
function segurarTesouro(Tesouro : TTesouro) : TTesouro;
public
property Arma : TArma read fArma;
property Tesouro : TTesouro read fTesouro;
end;

implementation

{ Jogador }

constructor Jogador.Create(nome : string);
begin
if Trim(nome) = ‘’ then
levantarExcecaoParametroNulo(nil, ‘O campo nome não pode ser nulo’);

inherited Create;
fArma := TArma.Create(TipoDeArma.FACA);
fTesouro := null;
armadura := TArmadura.Create(TipoDeArmadura.NENHUMA);
fNnome := nome;
reiniciarNumeroDeVidas;
end;

destructor Jogador.Destroy;
begin
fArma.Free;
armadura.Free;
inherited;
end;

procedure Jogador.reiniciarNumeroDeVidas;
begin
numeroDeVidas := 10;
end;

procedure Jogador.levantarExcecaoParametroNulo(parametro: TObject;
nomeDoParametro: string);
begin
if parametro = nil then
raise Exception.CreateFmt(‘O parâmetro %s não pode ser nulo!’, [nomeDoParametro]);
end;

procedure Jogador.beberPocaoDeVida;
begin
if tesouro is TPocaoDeVida then
begin
reiniciarNumeroDeVidas;
tesouro := nil;
end;
end;

procedure Jogador.golpeRecebido(inimigo : TInimigo; golpe : TGolpe);
var
danoCausado : Integer;
begin
levantarExcecaoParametroNulo(inimigo, ‘inimigo’);
levantarExcecaoParametroNulo(golpe, ‘golpe’);
danoCausado := golpe.danoQueCausa - armadura.tipo.nivelDeProtecao;

if danoCausado < 0
danoCausado = 0;

Dec(numeroDeVidas, danoCausado);

if observador <> nil then
observador.notificarContraAtaqueRecebido(inimigo, golpe, danoCausado);
end;

procedure Jogador.golpear(inimigo : TInimigo);
var
golpe : TGolpe;
begin
levantarExcecaoParametroNulo(inimigo, ‘inimigo’);

if not estaVivo()) then
raise IllegalStateException.Create(‘Operação illegal quando se está morto’);

if estrategiaDeCombate = nil then
raise ExcecaoEstrategiaNaoDefinida.Create(’’);

golpe := estrategiaDeCombate.gerarGolpe(self);
inimigo.golpeadoPor(Self, golpe);
end;

procedure Jogador.definirEstrategiaDeCombate(estrategia : EstrategiaDeCombate);
begin
levantarExcecaoParametroNulo(estrategia, ‘estrategia’);
estrategiaDeCombate = estrategia;
end;

function Jogador.segurarArma(arma : TArma) : TArma;
begin
levantarExcecaoParametroNulo(arma, ‘arma’);

if arma.tipo.danosQueElaCausa > Self.arma.tipo.danosQueElaCausa() then
begin
Result = Self.arma;
Self.arma = arma;
end else
Result = arma;
end;

function Jogador.vestirArmadura(armadura : TArmadura) : TArmadura;
begin
levantarExcecaoParametroNulo(armadura, ‘armadura’);

if armadura.tipo.nivelDeProtecao > Self.armadura.tipo.nivelDeProtecao then
begin
Result := Self.armadura;
Self.armadura := armadura;
end else
Result := armadura;
end;

function Jogador.estaVivo: Boolean;
begin
result := numeroDeVidas > 0;
end;

function Jogador.forcaDeAtaque: Integer;
begin
Result := 2 + arma.tipo.danosQueElaCausa;
end;

function Jogador.nome: string;
begin
Result := Self.nome;
end;

function Jogador.numeroDeVidasAtual: Integer;
begin
Result := numeroDeVidas;
end;

procedure Jogador.registrarObservador(observador: TObject);
begin
if observador = nil then
raise IllegalArgumentException.Create(‘O parâmetro ‘‘observador’’ não pode ser nulo!’);
Self.observador := observador;
end;

function Jogador.segurarTesouro(tesouro : TTesouro) : TTesouro;
begin
levantarExcecaoParametroNulo(tesouro, ‘pocaoDeVida’);
Result := Self.tesouro;
Self.tesouro := tesouro;
end;

end.
[/code]

sobre não usar o contador de referencia. vc pode usar o TInterfacedPersistent como acima.

nos casos q vc precisa de usar a contagem de referencia é só usar interfacedobject tomando um unico cuidado.
sempre usar referencia do tipo interface pq é a q é contada.

no caso do link o erro tava justamente nisso.

[quote=GilsonNunes]a mesma coisa em pascal:

[code]unit uJogador;

interface

uses
uLutador, Classes, SysUtils;

type
Jogador = class(TInterfacedPersistent, Lutador)
[/code][/quote]
Então não é só fazer

Jogador = class(Lutador)Como você havia colocado antes.

Era isso que eu queria dizer. Em linguagens com gerenciamento de memória eu não necessito ter esse cuidado. Uma falha ai introduz um erro difícil de encontrar!
Isso também introduz outro problema. Ao usar somente referencias do tipo interface eu não posso aumentar a responsabilidade de uma classe. Utilizando o exemplo do jogador eu não poderia fazer isso e ter a contagem de referencia;

[code]public class Armadura implements Tesouro {
private Random random = new Random();
private TipoDeArmadura tipoDeArmadura;

private void sortearArmadura(){
	int numeroDeArmaduras = TipoDeArmadura.values().length;
	tipoDeArmadura = TipoDeArmadura.values()[random.nextInt(numeroDeArmaduras - 1) + 1];
}

public Armadura(){
	sortearArmadura();
}

public Armadura(TipoDeArmadura tipo){
	if (tipo == null)
		throw new IllegalArgumentException("O parêmetro tipo não pode ser nulo");
	tipoDeArmadura = tipo;
}

@Override
public Tesouro transferirPara(Jogador jogador) {
	return jogador.vestirArmadura(this);		
}

@Override
public String nome() {
	return tipoDeArmadura.toString();
}

public TipoDeArmadura tipo() {
	return tipoDeArmadura;
}

}[/code]
Nesse caso o eu necessito passar uma referencia a um objeto Jogador, pois ele implementa o método vestirArmadura(Armadura armadura). Não posso também fazer uma cópia. Uma forma de driblar isso em delphi seria passar como uma referência a lutador e fazer um type cast, mas além de aumentar a complexidade não seria o ideal. Uma forma de evitar isso e ter a contagem de referência é seria eu mesmo implementar a contagem de referencia em uma classe e extende-la ao invés de extender interfacedobject, mas isso também aumenta meu trabalho e também pode introduzir erros.
Esse é um exemplo simples, na verdade a referencia a jogador se perde ao final de transferirPara(Jogador jogador) de modo que eu nem necessitaria de contagem de referência, mas serve para exemplificar o problema.

[quote=x@ndy][quote=juliocbq]
Não é mais fácil nem mais difícil, é a questão do conhecimento. Tem dois engenheiros que trabalham juntamente comigo aqui. Programam em assembly com facilidade de quem programa com java.
Se você sabe usar a ferramenta fica simples.
[/quote]

Boa colocação. Como eu sempre digo a ferramenta certa para o problema certo. Manda eles modelarem um sistema que usando OO daria uma dezena de classes em assembly. :smiley:
Vai ser mais “dificil” fazer em qual linguagem? Em qual vai ficar mais pronta mais rápido? Por que tudo que vocẽs tem ai não é feito em assembly?

Como você colocou, você programa em java ai. Então existe problemas ai que não podem ser resolvidos com assembly não é? Ou até podem, mas o trabalho seria infinitamente maior não?
Não estou colocando dificuldade como falta de conhecimento, mas dificulade de usar uma ferramenta quando ela não a é a ideal para o seu projeto.[/quote]

Agora você está falando besteira. Assembly e c é para hardware. Utilizamos java e c++ para alto nível.

[quote=juliocbq]
Agora você está falando besteira. Assembly e c é para hardware. Utilizamos java e c++ para alto nível.[/quote]
Por que besteira? Quer dizer que eu não posso utilizar C e Assembly para fazer programas em alto nível? Eu mesmo já criei interfaces gráficas para o windows e programas de alto nível utilizando C!
PS:
É necessário apenas ter o conhecimento necessário para fazer o programas de alto nível utilizando C. Com certeza não é uma tarefa fácil, exige um trabalho monstruoso, mas é possivel sim, agora porque eu vou fazer isso em C se existe linguagens e frameworks que já fizeram isso para mim?

x@ndy e juliocbq.
obrigado pela troca de informações.

estou aki pra aprender com vcs e juntos crescermos.

eu concordo plenamente q cada ferramenta tem sua utilidade e vc tem q usar a mais adequada.

e concordo q no java é melhor de se trabalhar com OO q no pascal.

porem o q me entristece são os absurdos q se vê por ai.

esses dias eu vi um artigo entitulado “Pascal x Java”

dentre tantas besteiras q vi. uma era Comparando o Object do java com Record do pascal. coisas mt distintas.
dps de acabar com o pascal (coitadinho do record) ele disse q no pascal tb tem o tipo class mas q tava fora do contexto do artigo.

[quote=GilsonNunes]x@ndy e juliocbq.
obrigado pela troca de informações.

estou aki pra aprender com vcs e juntos crescermos.
eu concordo plenamente q cada ferramenta tem sua utilidade e vc tem q usar a mais adequada.
e concordo q no java é melhor de se trabalhar com OO q no pascal.

[/quote]
Obrigado também, aprendi coisas novas com você, realmente eu não conhecia o FreeNotifcation.
Como já disse antes, para mim também não existe melhor linguagem de programação, porém eu acredito que o java seja melhor para se programar OO que Delphi. Digo isso porque utilizo Delphi até hoje e tenho alguns sistemas OO modelados nele e o que eu relatei foi justamente os problemas que passei para desenvolve-los. Java também não é a melhor linguagem de programação do mundo (eu pessoalmente ainda não encontrei a melhor linguagem, se é que ela existe). Acho que foi até aqui que coloquei que esses tempos fui desenvolver uma árvore binária em java e vi o quão difici, se torna isso devido a ausência de ponteiros. PS: com dificil, quer dizer trabalhoso.

[quote=GilsonNunes]porem o q me entristece são os absurdos q se vê por ai.
esses dias eu vi um artigo entitulado "Pascal x Java"
dentre tantas besteiras q vi. uma era Comparando o Object do java com Record do pascal. coisas mt distintas.
dps de acabar com o pascal (coitadinho do record) ele disse q no pascal tb tem o tipo class mas q tava fora do contexto do artigo.
[/quote]
:lol: Cara, se tu tiver, posta o link ai. Esse eu não li ainda. Pelo que tu disse da para ver que o cara é um especialista em programação…rsrsrsrs

meu prob não resolvido com o java é ele não compilar. só traduzir.

vc arrasta o prog e solta num descompilador(tradutor) ele mostra td seu fonte.

tem solução?

[quote=GilsonNunes]meu prob não resolvido com o java é ele não compilar. só traduzir.

vc arrasta o prog e solta num descompilador(tradutor) ele mostra td seu fonte.

tem solução?[/quote]
Realmente isso pode ser um problema se você distribui sua aplicação e não existe uma solução direta! O que existe são obfuscardores de código.
O que eles fazem, resumidamente, é substituir os nomes de variaveis, classes e funções por cadeia de caracteres aleatorias. Também retiram os comentários e a quebra de linha de modo a tornar o código ilegivel.
Segue um exemplo abaixo

[code]
import javax.swing.JOptionPane;

public class Program1
{
public static void main(String args[]) {
String first,second;
double choice;
double radius,width,area,length;
String value = " “; //intialize the string
value = JOptionPane.showInputDialog(“Please chose one of the options:”+”\n"+“a)Enter 1 to calculate the area of the Circle”+"\n"+“b)Enter 2 to calculate the area of the Triangle”+"\n"+“c)Enter 3 to calculate the area of the Square”+"\n"+“d)Enter 4 to calculate the area of the Rectangle”+"\n"+“e)Enter 5 to calculate the area of the Cube”+"\n"+“f)Enter 6 to exit the program”);
choice = Double.parseDouble(value);
while (choice != 6) {
//if(choice!=1||choice!=2||choice!=3||choice!=4||choice!=5)
// JOptionPane.showMessageDialog(null,“Wrong option entered”, " error",
// JOptionPane.ERROR_MESSAGE);
if (choice == 1) { //calculate the area of circle
first = JOptionPane.showInputDialog(“Enter the value of radius”);
radius = Double.parseDouble(first);
area = Math.PIradiusradius;
//print out the result
JOptionPane.showMessageDialog(null,“The area of the Circle: “+area,“result”,JOptionPane.INFORMATION_MESSAGE);
} else
if (choice == 2) { //calculate the area of triangle
first = JOptionPane.showInputDialog(“Enter the value of lenght”);
second = JOptionPane.showInputDialog(“Enter the value of width”);
length = Double.parseDouble(first);
width = Double.parseDouble(second);
area = (widthlength)/2;
JOptionPane.showMessageDialog(null,"The area of triangle: "+area,“result”,JOptionPane.INFORMATION_MESSAGE);
} else
if (choice == 3) { //calculate the area of square
first = JOptionPane.showInputDialog(“Enter the value of length”);
length = Double.parseDouble(first); //ge string into integer
area = length
length;
JOptionPane.showMessageDialog(null,“The area of the square: “+area,” result”,JOptionPane.INFORMATION_MESSAGE);
} else
if (choice == 4) { //calculate the area of rectangle
first = JOptionPane.showInputDialog(“Enter the value of length”);
second = JOptionPane.showInputDialog(“Enter the value of width”);
length = Double.parseDouble(first);
width = Double.parseDouble(second);
area = widthlength;
JOptionPane.showMessageDialog(null,"The area of the rectangle: "+area,“result”,JOptionPane.INFORMATION_MESSAGE);
} else
if (choice == 5) { //calculat the area of cube
first = JOptionPane.showInputDialog(“Enter the value of length”);
length = Double.parseDouble(first);
area = 6
length;
JOptionPane.showMessageDialog(null,“The area of the cube: “+area,“result”,JOptionPane.INFORMATION_MESSAGE);
}
value = JOptionPane.showInputDialog(“Please chose one of the options:”+”\n”+“a)Enter 1 to calculate the area of the Circle”+”\n”+“b)Enter 2 to calculate the area of the Triangle”+"\n"+“c)Enter 3 to calculate the area of the Square”+"\n"+“d)Enter 4 to calculate the area of the Rectangle”+"\n"+“e)Enter 5 to calculate the area of the Cube”+"\n"+“f)Enter 6 to exit the program”);
choice = Double.parseDouble(value);
} //end of while loop
System.out.println(“Program terminated\n”);
System.exit(0);
} //end of main
}
[/code] Após a obfuscação

import javax.swing.JOptionPane;

public class Program1
{
public static void main(String l1[]) {
String l10,O11;
double l100;
double O101,l110,l111,O1000;
String l1001 = " ";
l1001 = JOptionPane.showInputDialog("P\154\145\141se c\150o\163e\040\157ne of the \157\160\164i\157ns:" + "\012" + "\141\051\105\156t\145r\0401\040\164o\040\143alc\165late \164\150e\040\141r\145a\040of \164\150e\040C\151\162c\154e" + "\012" + "b\051Enter 2 t\157\040c\141lc\165l\141\164e the \141\162\145a\040o\146 t\150e\040Tr\151\141n\147\154e" + "\012" + "c\051Enter 3\040t\157 \143a\154\143ulate the ar\145\141 \157\146\040th\145 \123quar\145" + "\012" + "\144)\105\156\164\145r\0404\040t\157\040\143\141\154c\165\154a\164e\040t\150e\040ar\145a\040o\146 \164h\145 R\145c\164a\156g\154e" + "\012" + "\145)\105\156\164\145r\0405\040t\157\040\143\141\154c\165\154a\164\145\040\164h\145 \141\162ea\040o\146\040t\150e\040Cub\145" + "\012" + "\146)\105\156\164e\162 \066 \164o \145xit the p\162\157gr\141m");
l100 = Double.parseDouble(l1001);
while (l100 != 6) {
if (l100 == 1) {
l10 = JOptionPane.showInputDialog("\105n\164\145\162\040t\150e\040v\141\154\165\145\040o\146\040r\141\144iu\163");
O101 = Double.parseDouble(l10);
l111 = Math.PI * O101 * O101;
JOptionPane.showMessageDialog(null, "\124\150\145\040\141r\145a\040of\040\164\150e Ci\162\143l\145\072\040\040 \040" + l111, "result", JOptionPane.INFORMATION_MESSAGE);
} else
if (l100 == 2) {
l10 = JOptionPane.showInputDialog("Ent\145r\040\164\150e\040v\141l\165e \157\146\040\154en\147ht");
O11 = JOptionPane.showInputDialog("\105\156\164\145\162 \164h\145 value of\040width");
O1000 = Double.parseDouble(l10);
l110 = Double.parseDouble(O11);
l111 = (l110 * O1000) / 2;
JOptionPane.showMessageDialog(null, "T\150e area \157f\040t\162i\141\156g\154e:     " + l111, "re\163ult", JOptionPane.INFORMATION_MESSAGE);
} else
if (l100 == 3) {
l10 = JOptionPane.showInputDialog("\105\156\164\145\162 \164h\145 value\040of lengt\150");
O1000 = Double.parseDouble(l10);
l111 = O1000 * O1000;
JOptionPane.showMessageDialog(null, "\124he area \157f \164h\145 \163\161uare:    " + l111, " re\163ul\164", JOptionPane.INFORMATION_MESSAGE);
} else
if (l100 == 4) {
l10 = JOptionPane.showInputDialog("\105\156\164er t\150e\040v\141lu\145\040\157f len\147\164h");
O11 = JOptionPane.showInputDialog("E\156\164er the\040v\141l\165e \157\146 width");
O1000 = Double.parseDouble(l10);
l110 = Double.parseDouble(O11);
l111 = l110 * O1000;
JOptionPane.showMessageDialog(null, "T\150e are\141\040o\146 \164h\145 rectangle:     " + l111, "\162\145\163\165\154t", JOptionPane.INFORMATION_MESSAGE);
} else
if (l100 == 5) {
l10 = JOptionPane.showInputDialog("E\156ter t\150\145\040v\141l\165\145\040of lengt\150");
O1000 = Double.parseDouble(l10);
l111 = 6 * O1000;
JOptionPane.showMessageDialog(null, "T\150e area \157f\040t\150e\040\143\165\142e:  " + l111, "r\145sult", JOptionPane.INFORMATION_MESSAGE);
}
l1001 = JOptionPane.showInputDialog("P\154ease\040\143h\157s\145 \157ne of the options\072" + "\012" + "\141)\105\156\164e\162 \061 \164o c\141\154culat\145\040th\145 \141r\145a \157f\040th\145 \103i\162cl\145" + "\012" + "\142\051\105\156\164e\162 \062 to \143\141lculat\145\040th\145 \141re\141 \157f\040\164h\145 \124r\151an\147le" + "\012" + "c\051\105\156ter 3\040t\157 \143alc\165\154ate th\145\040ar\145a\040of\040t\150\145 \123q\165a\162e" + "\012" + "\144)Ente\162\0404\040t\157 \143alc\165\154ate th\145\040a\162\145\141\040o\146 \164\150e\040R\145c\164a\156g\154e" + "\012" + "\145)Ent\145\162 \065 \164o\040\143\141\154\143ula\164\145 \164\150\145\040a\162ea\040o\146 \164h\145 C\165b\145" + "\012" + "\146)\105\156\164e\162 \066 \164o \145\170it t\150e\040\160r\157\147r\141m");
l100 = Double.parseDouble(l1001);
}
System.out.println("\120r\157\147\162a\155 \164e\162mi\156a\164ed\012");
System.exit(0);
}
}