Por que as interfaces são necessárias? Por que a herança de interface é necessária? Por que o polimorfismo é necessário? Para quem leu e entendeu como fazer herança de interface, mas não entendeu o porquê. Da última vez, usando o exemplo da família comum Ivanov, analisamos por que as interfaces são necessárias. Continuamos a digitalizar a família problemática. Cada pessoa tem alguns hábitos que não herdou de ninguém ou não transmitiu a ninguém - seus hábitos pessoais. Nossa tarefa é proporcionar a cada membro da família hábitos únicos. Vamos para o plano Java: precisamos implementar métodos únicos em classes que pertencerão apenas a essas classes. Bem, vá em frente! Esta é Petya:
class Петя implements ПривычкиПапы, ПривычкиМамы {
//это личные Петины привычки
public void ковырятьВНосу () {
System.out.println("Ковырь-ковырь");
}
//это унаследованные привычки
@Override
public void прихлюпывать() {
System.out.println("Хлюп");
}
@Override
public void поджимать () {
System.out.println("Поджать губки");
}
}
Este é o papai:
class Папа implements ПривычкиПапы {
//это личные Папины привычки
public void чесатьБороду () {
System.out.println("Чешу бороду");
}
//это переданные привычки
@Override
public void прихлюпывать() {
System.out.println("Хлюп");
}
}
Esta é a mamãe:
class Мама implements ПривычкиМамы{
//это личные Мамины привычки
public void хлопатьРесницами () {
System.out.println("Хлоп-хлоп");
}
//это переданные привычки
@Override
public void поджимать() {
System.out.println("Поджать губки");
}
}
Perfeito! Tudo funciona como deveria! No primeiro artigo foi dito que o programa é um reflexo do mundo real. A propriedade mais interessante da realidade é que ela muda o tempo todo. A família Ivanov não foi exceção: eles tiveram uma filha doce chamada Masha. E ela herdou da mãe o hábito de piscar os cílios e do pai fungar. Precisamos fazer mudanças em nosso programa. Vamos lá, não é tão difícil, o principal é pensar logicamente. Afinal, todos sabem por que as interfaces são necessárias. Agora vamos criar uma interface para os Hábitos da Masha , descrever os métodos clapElashes() e squish() lá , implementá-los na Masha e pronto. E se métodos com o mesmo nome já estiverem implementados em outras interfaces, você poderá fazer isso uma vez. Na verdade, quem sabe quais são os planos da família Ivanov, caso nasça Seryozha , que herdará hábitos do papai, da mãe, do bisavô e de outra pessoa da quarta geração, cada vez criando uma interface, como: interface Hábitos de Seryozha , e aí declarar métodos que já podem ser declarados centenas de vezes em outras interfaces? Em algumas ou três gerações corremos o risco de obter interfaces com um monte de métodos idênticos que já estão descritos em outras interfaces, e se precisarmos mudar o nome de algum hábito (e isso é bem possível - afinal, o mundo está mudando) , então como descobrir esse espaguete, não consigo imaginar. Resta apenas sentar e sonhar com um milagre. Agora, se cada hábito tivesse sua interface. Vamos imaginar:
public interface ПривычкаПрихлюпывать {
public void прихлюпывать();
}
public interface ПривычкаПоджимать {
public void поджимать();
}
public interface ПривычкаКовырятьВНосу {
public void ковырятьВНосу();
}
public interface ПривычкаХлопатьРесницами {
public void хлопатьРесницами();
}
public interface ПривычкаЧесатьБороду {
public void чесатьБороду();
}
E então, como no Lego, poderíamos, usando herança múltipla de hábitos individuais, digitar a interface necessária para os hábitos de um membro individual da família. Algo assim:
public interface ПривычкиМамы extends ПривычкаПоджимать, ПривычкаХлопатьРесницами {
}
public interface ПривычкиПапы extends ПривычкаЧесатьБороду, ПривычкаХлюпать {
}
public interface ПривычкиПети extends ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу {
}
public interface ПривычкиМаши extends ПривычкаХлюпать, ПривычкаХлопатьРесницами {
}
E então simplesmente implemente a interface desejada para a classe desejada, por exemplo, Mom:
class Мама implements ПривычкиМамы{
@Override
public void хлопатьРесницами () {
System.out.println("Хлоп-хлоп");
}
@Override
public void поджимать() {
System.out.println("Поджать губки");
}
}
O mesmo poderia ser feito com Papa, Petya e Masha . E então, com a expansão da família Ivanov, não haveria problemas com hábitos, simplesmente os embaralharíamos por herança no nível da interface, como ingredientes em uma salada, e não produziríamos um monte de métodos com o mesmo nome. Eh, sonhos, sonhos... O homem desenhado tem razão, isso é realmente possível - agora a simulação da família Ivanov está salva! Um leitor atento pode fazer a pergunta: "Por que criar interfaces para cada membro da família? Temos um conjunto de ações - implemente-as imediatamente para a classe necessária." Vamos imaginar que em muitos mundos paralelos existem duplos de Petya , e todos os Petyas precisam implementar a interface Hábitos de Petya
interface ПривычкиПети extends ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
class ПетяВселеннаяХ implements ПривычкиПети
class ПетяВселеннаяY implements ПривычкиПети
// и т.д.
E se não houvesse uma interface comum?
class ПетяВселеннаяХ implements ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
class ПетяВселеннаяY implements ПривычкаПоджимать, ПривычкаХлюпать,ПривычкаКовырятьВНосу
// и т.д.
Isso resulta em código mais repetitivo. A herança de interface torna o aplicativo mais flexível para alterações, em particular, problemas com repetição de métodos podem ser resolvidos. Observe novamente que a herança múltipla de interfaces é permitida.
GO TO FULL VERSION