Java - Dúvida: Herança - "Desativar" Método

Olá galera, estava criando algumas personalizações dos JComponents e me deparei com uma dúvida.
Como “desativar” um método da classe pai?

Exemplo:

[code]public class Policia {
String nome;
String cidadeNatal;
float salario;

public String getCidadeNatal(){
	return cidadeNatal;
}
//Outros Getters e Setters

}[/code]

public class PoliciaFederal extends Policia{ //Aqui por algum motivo eu não quero ter o metodo getCidadeNatal() }

Muito obrigado. :slight_smile:

Eu conheço duas formas de “desativar” um método.

1ª - Trocando o modificador de acesso de public para private, só a classe pai terá acesso e só ela enxerga/ sabe que existe.

private String getCidadeNatal(){  
   return cidadeNatal;  
}

2ª (indicado para métodos que retornam void) - Sobrescrever o método na classe filha sem nenhuma implementação:

@Overrirde
public void metodoInutil() { }

No seu caso como você retorna uma String, é meio feio, mas poderia ficar assim:

public String getCidadeNatal(){  
   return null;  
}

Agora te pergunto, comparando herança da orientação a objetos com a da vida real, é possível você “desativar” seu dna ou sua cor de pele, olhos etc?

Pense nisso.

a resposta é

Não se desativa.

O máximo que você pode fazer é sobre escrever o para que ele não faça nada (mas isso é gambiarra) e não é aconselhado a ninguém fazer isso.

Só estenda uma classe se você for usar todos os recursos que ela te permite, caso contrario você está fazendo isso errado.

o que você deve fazer seria + ou - assim

public class Policia { //Getters e Setters }

[code]
public class Policial extends Policia {
String nome;
String cidadeNatal;
float salario;

public String getCidadeNatal(){  
    return cidadeNatal;  

}

//sobre escrita dos Setters e Getters

}[/code]

public class PoliciaFederal extends Policia{  
        //sobre escrita dos Setters e Getters
    }  

[quote=solidsnake]Eu conheço duas formas de “desativar” um método.

1ª - Trocando o modificador de acesso de public para private, só a classe pai terá acesso e só ela enxerga.

private String getCidadeNatal(){  
   return cidadeNatal;  
}

2ª (indicado para métodos que retornam void) - Sobrescrever o método na classe filha sem nenhuma implementação:

@Overrirde
public void metodoInutil() { }

No seu caso como você retorna uma String, é meio feio, mas poderia ficar assim:

public String getCidadeNatal(){  
   return null;  
}

Agora te pergunto, comparando herança da orientação a objetos com a da vida real, é possível você “desativar” seu dna ou sua cor de pele, olhos etc?

Pense nisso.[/quote]

então tome cuidado com isso pois é gambiarra fazer uma das duas opções

[quote=Victor Gerin]a resposta é

Não se desativa.

O máximo que você pode fazer é sobre escrever o para que ele não faça nada (mas isso é gambiarra) e não é aconselhado a ninguém fazer isso.

Só estenda uma classe se você for usar todos os recursos que ela te permite, caso contrario você está fazendo isso errado.

o que você deve usar no caso é implementação que seria + ou - assim

public interface Policia { //Getters e Setters }

[code]
public class Policial implements Policia {
String nome;
String cidadeNatal;
float salario;

public String getCidadeNatal(){  
    return cidadeNatal;  

}

//sobre escrita dos Setters e Getters

}[/code]

public class PoliciaFederal implements Policia{ //sobre escrita dos Setters e Getters } [/quote]

Pô mano, tô estimulando o raciocínio do cara e você corta desse jeito? A pergunta era pro autor do tópico man! kkkkkk

Brincadeiras a parte, tá vendo só VA, como herança só atrapalha? Até para devolver os bens da partilha fica difícil. kkkkk

quando eu comecei a escrever você n tinha escrito ainda rsrs

mas eu mudei para usar herança acho que vai ser melhor no caso dele ao invés de implementar rsrs

[quote=Victor Gerin]quando eu comecei a escrever você n tinha escrito ainda rsrs

mas eu mudei para usar herança acho que vai ser melhor no caso dele ao invés de implementar rsrs[/quote]

Eu tô ligado, também sei que os dois métodos são gambiarras, mas é que se a gente ficar mostrando tudo, seguindo boas práticas e tudo mais, fica mais complicado o aprendizado por parte do interessado e além do mais ele não perguntou se eram métodos lícitos ou ílicitos?

kkkkkk, mas foi boa a discussão.

E o pior que agora eu to vendo, na ordem que ficou os posts, dá impressão que sua resposta era referente minha pergunta, kkkkk…

Eu ter pergunto… a resposta é… kkkkkk, que da hora!!!

kkkk e mesmo

Valeu, galera.

Vou especificar o meu caso, mas o que vocês comentaram me ajudou bastante.

No Swing tem a classe JButton que por sua vez tem o método “getText()” - o texto que aparece como nome do botão.

no caso no código do JButton padrão está algo mais ou menos assim:

protected String getText(){ return text; }
Eu sabia da sobreposição, fazendo com que esse método em uma classe derivada retorna-se nulo (como falaram).
Porém eu gostaria que esse método simplesmente não existi-se. Pelo que vejo é impossível ele “não existir” e pra fazer esses gambiarras é melhor deixar ele quieto para o meu caso. Kkkkkkk
Valeu, galera!

[quote=VA]Olá galera, estava criando algumas personalizações dos JComponents e me deparei com uma dúvida.
Como “desativar” um método da classe pai?

Exemplo:

[code]public class Policia {
String nome;
String cidadeNatal;
float salario;

public String getCidadeNatal(){
	return cidadeNatal;
}
//Outros Getters e Setters

}[/code]

public class PoliciaFederal extends Policia{ //Aqui por algum motivo eu não quero ter o metodo getCidadeNatal() }

Muito obrigado. :)[/quote]

http://www.stevideter.com/2008/05/04/understanding-the-protected-access-modifier-and-inheritance-in-java/#comments

Seu método tem que ser protegido

outro exemplo:

deixa eu ver se entendi, você quer criar um botão personalizado ?

Utilizando como base o próprio JButton ?

Se sim. o que você etereamente que fazer com esse botão personalizado que o JButton não faz ?

Caso contrario explique-se melhor por favor

[quote=VA]Valeu, galera.

Vou especificar o meu caso, mas o que vocês comentaram me ajudou bastante.

No Swing tem a classe JButton que por sua vez tem o método “getText()” - o texto que aparece como nome do botão.

no caso no código do JButton padrão está algo mais ou menos assim:

protected String getText(){ return text; }
Eu sabia da sobreposição, fazendo com que esse método em uma classe derivada retorna-se nulo (como falaram).
Porém eu gostaria que esse método simplesmente não existi-se. Pelo que vejo é impossível ele “não existir” e pra fazer esses gambiarras é melhor deixar ele quieto para o meu caso. Kkkkkkk
Valeu, galera!
[/quote]

Beleza, mas conseguiu pegar que além de fazer gambiarras, evite ao máximo usar heranças, você mesmo está começando a ter dificuldades em não implementar códigos para classes que não precisam, mas acabam tendo “no sangue”, pra quem curte animê e já assistiu Yu Yu Hakusho o termo “herança da maldade” cai perfeitamente.

Ou como diria o zoiudinho do madagascar… ela é do maaaal!!! kkkkkk

[quote=solidsnake]
Beleza, mas conseguiu pegar que além de fazer gambiarras, evite ao máximo usar heranças, você mesmo está começando a ter dificuldades em não implementar códigos para classes que não precisam, mas acabam tendo “no sangue”, pra quem curte animê e já assistiu Yu Yu Hakusho o termo “herança da maldade” cai perfeitamente.

Ou como diria o zoiudinho do madagascar… ela é do maaaal!!! kkkkkk[/quote]

HUahuahaua

É verdade. Dependendo do caso, eu usaria uma composição.

Valeu mesmo galera!
No meu caso eu consegui resolver facilmente.
Já que eu na verdade não iria utilizar funções do JButton, iria apenas criar um button personalizado (desenhando com paintComponent). Resolvi usar o JComponent e funcionou normalmente. :smiley:

[quote=VA]Valeu mesmo galera!
No meu caso eu consegui resolver facilmente.
Já que eu na verdade não iria utilizar funções do JButton, iria apenas criar um button personalizado (desenhando com paintComponent). Resolvi usar o JComponent e funcionou normalmente. :D[/quote]

Você é um fanfarrão rapaz, kkkk, quase fez eu e o mano Victor Gerin brigar por causa de Herança, kkkkk, você tá vendo o mal que ela faz? kkkkkk

[quote=solidsnake][quote=VA]Valeu mesmo galera!
No meu caso eu consegui resolver facilmente.
Já que eu na verdade não iria utilizar funções do JButton, iria apenas criar um button personalizado (desenhando com paintComponent). Resolvi usar o JComponent e funcionou normalmente. :D[/quote]

Você é um fanfarrão rapaz, kkkk, quase fez eu e o mano Victor Gerin brigar por causa de Herança, kkkkk, você tá vendo o mal que ela faz? kkkkkk[/quote]

ashuahsuashuahsu kkkkk

KKkkkk Mas ajudou já que eu vi que não tinha jeito o que eu desejava fazer, a não ser que eu fizesse uma gambiarra.

Olá,

Tem duas abordagens para o problema:

____ — ____________
A primeira é considerar que exista um erro no conceito, na modelagem. É um caso que não se aplica herança.

Você tem a classe Polícia, pela presença do campo Cidade fica subentendido que se trata de uma polícia local, urbana. Por esse motivo vou tomar a liberdade de renomear a classe para PoliciaLocal.
Depois entrou a PoliciaFederal herdando de PoliciaLocal. Agora ficou clara a inconsistência: PoliciaFederal É UM PoliciaLocal ? Não!

É como dizer: "se eu fizer uma classe Gato extends Cachorro, como faço para desabilitar o método latir() ? ". Estaria violando o conceito da herança, pois o gato NÃO É um cachorro, não é uma ESPECIALIZAÇÃO de cachorro. Uma especialização faz tudo que a classe mãe faz, e mais um pouco. Isso seria uma especialização válida:

class CaoFarejador extends Cachorro { public void localizar(Object alvo) { // ... } Percebeu? Em uma especialização válida não há necessidade de “desabilitar” métodos, o CaoFarejador pode latir() sem problemas ao contrário do gato.

A mesma coisa acontece com PoliciaFederal herdando de PoliciaLocal, não é uma especialização válida. A relação “É UM” não foi respeitada, e isso se manifesta através de sintomas como esse… “como desabilitar tal método da classe mãe?” . Isso é um sinal de herança que não foi bem aplicada!

Poderia ser feito assim:

class Policia {
     public String getNome();
     public BigDecimal getSalario();
}

class PoliciaLocal extends Policia {
     public String getCidade();
}

class PoliciaFederal extends Policia {
     // Adiciona aqui coisas especificas de policia federal.
}

Agora sim… ambos PoliciaLocal e PoliciaFederal são diferentes especializações de Policia.

____ — ____________
A outra forma de considerar a questão é pensar que é normal a cidadeNatal não estar presente no caso de polícias não-locais
Você documentaria o método dessa maneira:

/*
* Retorna a cidade de residência do policial.
*
* Quando a informação não é aplicável ao tipo de polícia representado pela instância, esse método retornará null.
*/
public getCidade() {
//....


class PoliciaFederal() {
public getCidade() {
    // PoliciaFederal não possui uma Cidade associada. Em conformidade com a especificação do método
    // getCidade(), retorna null
    return null;
}
}

----___
A maneira correta depende do caso, de todo o contexto do negócio que se está modelando. Pense bastante sobre isso, mas atenção, pense no que é mais correto e não apenas no código mais curto!!!

Nossa cara! Que resposta! Valeu mesmo! :smiley:
Se estava claro antes agora, sim, ficou claro!