[quote=71C4700]Novamente, agradeço pela resposta, mas a duvida continua.
O que queria saber é qual a melhor maneira de utilizar as duas situações.
Primeiro: Tenho uma classe A (super), que será herdada por outra classe B (subclasse).
Segundo:Tenho uma classe A(super, mas abstrata), que será herdada por outra classe B (subclasse).
Quando devo utilizar um caso e não outro?
[/quote]
Se vc pdoe instanciar A por si mesmo, então A não pode ser abstracta , logo, use o primeiro. Se A pode ser instanciada por si mesma então ela não é asbtracta.
Por exemplo A = Animal, B = Cao. Animal é abstrato porque vc não o pode instanciar. ( se instanciar Animal que animal ele seria ? todos ? nenhum ?)
Agora, como passo suplementa, se A é abstrata e todos os seus métodos são abstratos , então use uma interface em vez de classe.
Se vc tem alguma implementação default para algum método a classe tem que ser abstrata e não pode ser um interface.
Os métodos comuns podem ser implementados e os especiais deixados abstratos. Por exemplo, Todos os animais pertencem a uma especie. Logo animal tem um get/setEspecie. Como isso é comum a todos posso implementar isso direto na classe abstrata.
inclusive o atributo (que deverá ser private).
Se a propriedade não é comum a todos os filhos da classe ela não pode estar na classe pai.
A classe abstrata sim estabelece um contrato, mas tb estabelece um comportamento padrão.
Essa é a diferença para interface (que só define um contrato).
Eu costume criar todas os tipos abstratos ( os que são a raiz da hierarquia) como interfaces. Depois crio uma classe implementando a essa interface. Se em algum ponto em deteto que existem coisas comuns a vários objetos da interface eu crio uma classe abstrata intermediária de onde os outros herdam que implementa a interface e implementa alguns métodos com comportamentos comuns a todas as sub classes. às vezes essas comportamentos seguem o mesmo algoritmo geral, mas mudam alguns detalhes. Nesse caso é hora de usar o padrão Template.