preciso de uma dica de poo
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!
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
Curtidas 0
Respostas
Lab
08/02/2007
Crie um método público na sua classe através do qual você poderá setar as propriedades dos componentes citados.
GOSTEI 0
Vitor Rubio
08/02/2007
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.
GOSTEI 0
Leonardobhbr
08/02/2007
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
[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
GOSTEI 0
Vitor Rubio
08/02/2007
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.
GOSTEI 0
Leonardobhbr
08/02/2007
É 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
GOSTEI 0
Callegaro
08/02/2007
A solução, acredito eu, é definir o método público que retorna o objeto que você está buscando como Virtual.
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.
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.
GOSTEI 0
Rjun
08/02/2007
Você poderia colocar a definição da sua classe?
GOSTEI 0
Vitor Rubio
08/02/2007
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:
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 ^^
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 ^^
GOSTEI 0