• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

DarkSKull2

classes parametrizadas

11 mensagens neste tópico

boas eu queria fazer algo do género:

interface Interf{

void metodo1();
void metodo2();

}

class C1 implements Interf{
...
void metodo1(){...};
void metodo2(){...};
...
}


class Gen1<T implements Interf>{
T t;

void metod(){
t.metodo1();
}

o problema esta na classe Gen1...

como faço para dizer que o parâmetro T tem obrigatoriamente de implementar o interface Interf, a fim de depois no código poder chamar os métodos definidos em Interf nas instancias de T

alguém sabe ???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se queres uma classe em que T tenha o interface implementado então metes T do tipo do Interface não precisas de usar Generics, Generics é para uma coisa geral no teu caso tu queres algo especifico.

É isso ou percebi mal ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que queres, se não me engano, é só :


class Gen1<Interf>{
Interf in;

void metod(){
in.metodo1();
}

Quanquer objecto que implemente a interface pode ser enviado para a classe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas eu vou querer alguns métodos do tipo

public T get(int id){... };

o interface Interf é apenas um subconjunto dos metodos que o Object T tem

se não parametrizar com T e usar o Interface Interf como tipo de retorno, vou perder métodos...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi, queres aceder a métodos que não estão na interface?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim

a classe genérica que preciso vai ser algo do género de uma colecção de coisas do tipo T

mas preciso de usar certos métodos para saber como organizar as coisas e quero garantir que todos os T implementem esses métodos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou eu não estou a perceber ou está aqui alguma confusão.

Se queres garantir que todos os parametros implementam a interface então parametrizas a classe para receber a interface, assim garantes que todos os objectos que enviares implementam a interface.

Isto é:

class Gen1<T implements Interf>{
T t;

void metod(){
t.metodo1();
}

é igual a:

class Gen1<Interf>{
Interf in;

void metod(){
in.metodo1();
}

no sentido em que todos os objectos que enviares implementam a interface Interf.

Podes dar um exemplo com código do que queres fazer, por exemplo indicares dois ou três classes que queiras usar?

Se quiseres chamar métodos que não estão definidos na interface então tens um problema, nada te garante que o método está no objecto passado. Não tens garantias que o método existe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

exemplos nao tenho porque deu erro logo na primeira linha ou definir

'class Man<T implements OrgAble>'

mas o objectivo é mais tarde surgir um bloco de código do género

...
Man<Func> funcs = new Man<Func>();

Func f1 = funcs.get(33);
Func f2 = funcs.get(55);

f2.metodoKSoExisteParaFunc();

Man<Prod> prods = new Man<Prod>();

Prod p1 = prods.get(1);
Prod p2 = prods.get(2);

p1.metodoKSoExisteParaProd();

...

Prod e Func implementam o mesmo interface 'ManAble' que so tem um método que diz descreve a estrutura  de Func e Prod para o Man saber como manipular os Prod e Func

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se ninguém sabe em vez de uma genérica faço N delas ...

hasta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que queres é

class MyClass<T extends MyInterface> {
   ...
}

Se não me engano o extends é tanto para classes base como para interfaces. É por estes casos que prefiro C# a Java. Programação genérica está tão melhor implementada.

Se não me engano, acho que deixei um link para uma comparação entre C# e Java em termos de programação genérica no board da discussão geral, lá tinha este caso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora