Meu entendimento atual da implementação de herança é que só se deve estender uma classe se houver uma relação IS-A . Se a classe pai puder ainda ter tipos filhos mais específicos com funcionalidade diferente, mas compartilhará elementos comuns abstraídos no pai.
Estou questionando esse entendimento por causa do que meu professor de Java está nos recomendando a fazer. Ele recomendou que, para um JSwing
aplicativo que estamos construindo em sala de aula
Um deve se estender todas as JSwing
classes ( JFrame
, JButton
, JTextBox
, etc) em classes personalizadas separadas e especificar GUI personalização relacionado neles (como o tamanho do componente, etiqueta componente, etc)
Até aí tudo bem, mas ele continua aconselhando que todo JButton deve ter sua própria classe estendida personalizada, mesmo que o único fator distintivo seja o rótulo.
Por exemplo, se a GUI tiver dois botões OK e Cancelar . Ele recomenda que eles sejam estendidos conforme abaixo:
class OkayButton extends JButton{
MainUI mui;
public OkayButton(MainUI mui) {
setSize(80,60);
setText("Okay");
this.mui = mui;
mui.add(this);
}
}
class CancelButton extends JButton{
MainUI mui;
public CancelButton(MainUI mui) {
setSize(80,60);
setText("Cancel");
this.mui = mui;
mui.add(this);
}
}
Como você pode ver, a única diferença está na setText
função.
Então, essa é uma prática padrão?
Btw, o curso em que isso foi discutido é chamado de Melhores Práticas de Programação em Java
[Resposta do Prof]
Então, discuti o problema com o professor e levantei todos os pontos mencionados nas respostas.
Sua justificativa é que a subclasse fornece código reutilizável enquanto segue os padrões de design da GUI. Por exemplo, se o desenvolvedor usou botões Okay
e Cancel
botões personalizados em uma janela, será mais fácil colocar os mesmos botões em outro Windows também.
Entendo o motivo que suponho, mas ainda está apenas explorando a herança e tornando o código frágil.
Mais tarde, qualquer desenvolvedor pode acidentalmente chamar o setText
em um Okay
botão e mudá-lo. A subclasse apenas se torna um incômodo nesse caso.
JButton
e chamar métodos públicos em seu construtor, quando você pode simplesmente criar umJButton
e chamar esses mesmos métodos públicos fora da classe?