Fórum preciso de uma dica de poo #337565

08/02/2007

0

meu problema é o seguinte: tenho uma classe que encapsula um sqlconection e outra que encapsula um sqldataset.

Como faço pra setar o sqlconnection desse sqldataset como sendo o sqlconnection da minha outra classe, sendo que tanto o sqlconection da classe A como o sqldataset da classe B são encapsulados e private?

Grato!


Vitor Rubio

Vitor Rubio

Responder

Posts

08/02/2007

Lab

Crie um método público na sua classe através do qual você poderá setar as propriedades dos componentes citados.


Responder

Gostei + 0

08/02/2007

Vitor Rubio

o problema é que a propriedade sqlconection do sqldataset é um objeto do tipo Tsqlconection. Só que esse objeto sqlconection está criado e instanciado dentro de outra classe, como private, sem ser acessível. E na classe que contém o sqldataset, o sqldataset também é private. Posso criar métodos pra modificar as propriedades, mas essa propriedade não dá, pois são as propriedades de objetos internos private.


Responder

Gostei + 0

08/02/2007

Leonardobhbr

Crie um metodo publico

[color=green:4cff53aedf]
getSQLConection
[/color:4cff53aedf]

na sua calsse que tem o sqlConection Retornando um objeto SQLConection que seria o da classe

e na outra classe so chamaria este metodo


Responder

Gostei + 0

09/02/2007

Vitor Rubio

isso com certeza funcionaria. Mas porque eu encapsulei assim? porque eu gostaria de ligar um objeto dependente de uma classe ao objeto da outra sem ter que saber que objeto é esse. Ao invés de sqlConection e sqlDataset, poderia ser ibDatabase e ibdataset, ou adoConecton e AdoDataset. entendeu? eu nõ gostaria que essa função pública retornasse fixamente apenas um sqlconection, senão teria que ter uma função para cada tipo de objeto a retornar.


Responder

Gostei + 0

09/02/2007

Leonardobhbr

É no delphi eu não conheço algo desse jeito só se vc fizesse typeCast e no java existe Generics que poderia ser implementado só que delphi não tem, tem que ver talvez o massuda consiga responder isto


Responder

Gostei + 0

09/02/2007

Callegaro

A solução, acredito eu, é definir o método público que retorna o objeto que você está buscando como Virtual.

Virtual methods are called in the same way as static methods, but because virtual methods can be overridden, the compiler doesn’t know the address of a particular virtual function when you call it in your code. The compiler, therefore, builds a Virtual Method Table (VMT) that provides a means to look up function addresses at runtime. All virtual method calls are dispatched at runtime through the VMT. An object’s VMT contains all its ancestor’s virtual methods as well as the ones it declares; therefore, virtual methods use more memory than dynamic methods, although they execute faster.

Retirado do livro Delphi 6.

Crie uma subclasse para cada tipo de objeto, e depois sobrecarregue o método de retorno do objeto. Acho que isto resolve seu problema.


Responder

Gostei + 0

09/02/2007

Rjun

Você poderia colocar a definição da sua classe?


Responder

Gostei + 0

12/02/2007

Vitor Rubio

Ainda não codifiquei, mas seria mais ou menos assim: gostaria de criar uma classe de acesso a banco de dados que fose independente tanto do banco como da tecnologia (datasets) usados. Seria um cojunto de várias classes que descendem de uma classe em comum ou implementam uma mesma interface. Então, por exemplo, as duas primeiras classes:

Tbanco = class
private
FsqlCon: TsqlConnection;
public
property Host : string;
property Login: string;
property Senha: string;
property Caminho: string;
property EAssimPorDiante: Tsucessivamente;
end;

TDados = class
private
FsqlDataset: TsqlDataSet;
public
property sql: string;
property Banco: Tbanco; //(opa!)
end;



Então, a pergunta é: o sqlDataset da segunda classe precisa ser ligado ao
sqlConnection da classe de cima. Todo sqlDataset precisa de um sqlConnection. Gostaria que não tivesse nada na minha classe (externamente, em sua interface) específico de tecnologia de acesso a dados, mas que ela criasse e implementasse tudo que precisasse internamente, de acordo com as propriedades setadas, arquivo de configuração, ou seja lá o que for. Mas gostaria de ligar a propriedade banco da Tacesso num objeto da Tbanco, e que quando eu fizesse isso, automaticamente ela ligasse o sqlDataset interno de TDados ao sqlConnection interno de Tbanco, sem precisar saber o tipo do banco ou que tipo de datset ela usaria para acessar (ADO, IBX, DBX, ZEOS etc)

Não gostaria de usar coisas que contrariam a poo como hack protected (ou a propria seção protected) e não gostaria de colocar as duas classes na mesma unit só pra uma classe acessar os campos private da outra porque isso também foga da POO. Se não existir jeito de fazer isso ´bunitamente´ então eu faço de qualquer outro jeito que também funcione, mas se der....

Agradeço pela ajuda ^^


Responder

Gostei + 0

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

Aceitar