Herança
Considere um carro e um ônibus. Eles são dois veículos diferentes. Ainda assim, eles compartilham algumas propriedades comuns, como direção, freios, marchas, motor etc.
Portanto, com o conceito de herança, isso pode ser representado da seguinte forma ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
Agora uma bicicleta ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
E um carro ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
Isso é tudo sobre herança . Nós os usamos para classificar objetos em formas Base mais simples e seus filhos, como vimos acima.
Classes abstratas
Classes abstratas são objetos incompletos . Para entender melhor, vamos considerar a analogia do veículo mais uma vez.
Um veículo pode ser conduzido. Direita? Mas veículos diferentes são dirigidos de maneiras diferentes ... Por exemplo, você não pode dirigir um carro da mesma maneira que dirige uma bicicleta.
Então, como representar a função de direção de um veículo? É mais difícil verificar que tipo de veículo é e conduzi-lo com sua própria função; você precisaria alterar a classe Driver repetidamente ao adicionar um novo tipo de veículo.
Aí vem o papel das classes e métodos abstratos. Você pode definir o método da unidade como abstrato para informar que todos os filhos herdados devem implementar esta função.
Então, se você modificar a classe do veículo ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
A bicicleta e o carro também devem especificar como conduzi-lo. Caso contrário, o código não será compilado e um erro será gerado.
Em resumo .. uma classe abstrata é uma classe parcialmente incompleta com algumas funções incompletas, que os filhos herdados devem especificar por si próprios.
Interfaces As
interfaces são totalmente incompletas. Eles não têm propriedades. Eles apenas indicam que os filhos herdados são capazes de fazer algo ...
Suponha que você tenha diferentes tipos de telefones celulares. Cada um deles tem maneiras diferentes de executar funções diferentes; Ex: ligue para uma pessoa. O fabricante do telefone especifica como fazê-lo. Aqui, os telefones celulares podem discar um número - ou seja, podem ser discados. Vamos representar isso como uma interface.
public interface Dialable {
public void dial(Number n);
}
Aqui, o fabricante do Dialable define como discar um número. Você só precisa fornecer um número para discar.
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Por meio deste, usando interfaces em vez de classes abstratas, o gravador da função que usa um Dialable não precisa se preocupar com suas propriedades. Ex: possui tela sensível ao toque ou teclado de discagem. É um telefone fixo ou celular. Você só precisa saber se é discável; ele herda (ou implementa) a interface Dialable.
E o mais importante , se algum dia você trocar o Dialable por outro
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Você pode ter certeza de que o código ainda funciona perfeitamente porque a função que usa a discagem não depende (e não pode) depender de outros detalhes além dos especificados na interface Discável. Ambos implementam uma interface Dialable e essa é a única coisa com a qual a função se importa.
As interfaces são comumente usadas pelos desenvolvedores para garantir a interoperabilidade (uso intercambiável) entre objetos, na medida em que compartilham uma função comum (assim como você pode mudar para um telefone fixo ou celular, na medida em que você só precisa discar um número). Em resumo, as interfaces são uma versão muito mais simples das classes abstratas, sem propriedades.
Além disso, observe que você pode implementar (herdar) quantas interfaces desejar, mas só pode estender (herdar) uma única classe-pai.
Mais informações
Classes abstratas vs interfaces