[quote=x@ndy][quote=GilsonNunes][quote=x@ndy]
Eu disse isso por que usar interfaces no java é muito simples e no delphi a pessoa tem que saber como a interface funciona, vamos a um exemplo usando a sua interface
Se eu fizer isso, como faria no java, vai gerar uma exceção
type
TTesteColor = class(IColor)
function getRed : Boolean;
property IsRed : Boolean read getRed;
end;
Pois a interface exige a implementação dos métodos
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;[/code]
Então ou implemento isso em todas as classes ou faço isso.
[code]type
TTesteColor = class(TInterfacedObject, IColor)
function getRed : Boolean;
property IsRed : Boolean read getRed;
end;[/code]Pois a interface exige a implementação dos métodos
Até ai tudo bem, mas o pior é que o cuidado que temos que ter para não misturar ponteiros para objetos com ponteiros para interfaces de modo a não termos problema, veja aqui: [url]http://br.groups.yahoo.com/group/delphi-br/message/196124[/url]
[/quote]
viu? é só uma questão de saber. vc deu dois exemplos o segundo tentou melhorar mas realmente ficou ruim comparando com java.
ma e o tercerio exemplo?
faltou ele: ele era o correto:
[code]unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;
type
IRotulavel = interface
function GetTexto : string;
function GetDesenvolvedor : string;
end;
{ Botao }
{ TBotao }
TBotao = Class(TButton, IRotulavel)
public
function GetTexto: string;
function GetDesenvolvedor: string;
end;
{ TGShape }
TGShape = Class(TShape, IRotulavel)
public
function GetTexto: string;
function GetDesenvolvedor: string;
end;
{ TForm1 }
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
procedure BotaoClick(Sender: TObject);
procedure ShapeClick(Sender: TObject);
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
{ TBotao }
function TBotao.GetTexto: string;
begin
Result := 'Botão: '+Caption;
end;
function TBotao.GetDesenvolvedor: string;
begin
Result := 'Gilson';
end;
{ TGShape }
function TGShape.GetTexto: string;
begin
Result := 'Shape: ' + ColorToString(Brush.Color);
end;
function TGShape.GetDesenvolvedor: string;
begin
Result := 'João';
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Tag := Tag + 1;
if Button = mbLeft then
begin
with TBotao.Create(Self) do
begin
Parent := Self;
Top:=Y;
Left:=X;
OnClick:=@BotaoClick;
Caption:=IntToStr(Self.Tag);
end;
end else
begin
with TGShape.Create(Self) do
begin
Parent := Self;
Top:=Y;
Left:=X;
OnClick:=@ShapeClick;
Brush.Color:= RGBToColor(Self.Tag * 10, Self.Tag * 40, Self.Tag * 80);
end;
end;
end;
procedure MostraTexto(obj : IRotulavel);
begin
ShowMessage(obj.GetTexto+#13#10'Feito por: '+obj.GetDesenvolvedor);
end;
procedure TForm1.BotaoClick(Sender: TObject);
begin
MostraTexto(Sender as TBotao);
end;
procedure TForm1.ShapeClick(Sender: TObject);
begin
MostraTexto(Sender as TGShape);
end;
end.
esse é um exemplo de uso de inteface, não?
no java teria q facilidade a mais?
[/quote]
Qual a diferença desse exemplo para o anterior? Parece que você esta querendo confundir, até porque (se não me engano), TComponent, já herda de TInterfacedObject que implementa os métodos. O que você fez, foi algo assim:
type
TColorBase = class(TInterfacedObject)
end;
...
type
TTesteColor = class(TColorBase, IColor)
function getRed : Boolean;
property IsRed : Boolean read getRed;
end;
Qual a diferença do seu exemplo afinal? Tirando o fato de você colocar a implementação também?
E pelo que eu vejo, você não leu o que estava no link, então vou copiar e colar aqui:
[quote]Re: [delphi-br] Problema com Objetos da classe TInterfacedObject + uma interface
PUBLICIDADE
2008/12/29 Thales (Shubacca) - Tebo Software <tebosoftware@…>:
O problema que estou encontrando é que após o dao persistir o objeto, ele
chama o destructor do objeto persistido, mas eu não destrui o mesmo.
Debugando descobri que o campo que conta as referencias do objeto fica com
valor 0 (zero) após a persistencia, mas ainda existe uma variavel local que
está fazendo referencia ao meu objeto.
alguém sabe como me ajudar nisso?
Parece que você está misturando ponteiros para objetos e ponteiros
para interface. O gerenciamento de memória do Delphi, no que tange
interfaces, é feito com contagem de referência: associação conta mais
um, alteração do ponteiro ou saída de escopo conta menos um. Mas se
você faz com que um ponteiro para objeto aponte para objetos que
também tem interfaces apontando, tão logo as interfaces saiam de
escopo e o objeto será destruído, deixando aquele ponteiro
referenciando uma área de memória inválida. Mais ou menos assim:
var
VObjI: IObj; // interface
VObjO: TObj; // TObj implementa IObj
begin
VObjO := TObj.Create;
VObjI := VObjO;
VObjI := nil;
VObjO.Free; // erro
end;
Caso o problema seja este, então ou você não mistura ponteiros para
objeto com ponteiros para interface, ou contorna da mesma forma que eu
contornei:
http://blog.joaomorais.com.br/2008/09/06/objetos-contagem-ref.html
Se não for, detalhe melhor a sua implementação.
–
Joao Morais[/quote][/quote]
Complementando:
No java é mais simples pois, só faço assim:
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 {
...
}