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!!!