Este artigo descreve o uso de interfaces Java e classes abstratas. Compartilhe -o para sua referência, como segue:
interface
1 Como o Java não suporta herança múltipla, com interfaces, uma classe pode herdar apenas uma classe pai, mas pode implementar várias interfaces, e a própria interface também pode herdar várias interfaces.
2 As variáveis de membro na interface são do tipo final público estático por padrão. Inicialização que deve ser exibida.
3 Os métodos na interface são de resumo público por padrão. Declaração implícita.
4 A interface não possui construtor e não pode ser instanciada.
5 Uma interface não pode implementar outra interface, mas pode herdar várias interfaces.
6 Se uma classe implementar uma interface, todos os métodos abstratos na interface devem ser implementados, caso contrário, a classe deve ser definida como uma classe abstrata.
Classe abstrata
1 Se uma classe for declarada como abstrata, essa classe não pode gerar objetos e só pode ser usada herdada.
2 métodos abstratos devem existir em classes abstratas.
3 Pode haver variáveis gerais e métodos gerais em classes abstratas.
4 As subclasses herdam uma classe abstrata deve implementar seus métodos abstratos, a menos que a subclasse seja uma classe abstrata.
private void print () {}; Esta declaração representa a implementação vazia do método.
Resumo Void Print (); Esta declaração representa a abstração do método, sem implementação.
A diferença entre interface e classe abstrata
1 A interface pode conter apenas métodos abstratos e classes abstratas podem conter métodos comuns.
2 A interface pode definir apenas propriedades constantes estáticas. Classes abstratas podem definir propriedades comuns e propriedades constantes estáticas.
3 A interface não contém métodos construtores e classes abstratas podem conter métodos construtores.
A classe abstrata não pode ser instanciada, mas não significa que não pode ter um construtor. A classe abstrata pode ter um construtor e é uma classe de substituição.
1 A interface é o núcleo, que define o que fazer e contém muitos métodos, mas não define como esses métodos devem ser feitos.
2 Se muitas classes implementarem uma interface, cada uma delas precisará implementar esses métodos no código.
3 Se as implementações de algumas classes tiverem algo em comum, uma classe abstrata poderá ser abstrata para permitir que a classe abstrata implemente o código comum da interface, enquanto esses métodos personalizados são implementados por cada subclasse.
Portanto, classes abstratas são projetadas para simplificar a implementação de interfaces. Eles não apenas fornecem a implementação de métodos públicos, permitindo que você se desenvolva rapidamente, mas também permite que suas classes implementem todos os métodos por si mesmos sem problemas de acoplamento apertados.
O aplicativo é muito simples
1. Defina interfaces primeiro
2 Se houver várias implementações de interface que possuem peças comuns, use classes abstratas e as integre.
A diferença entre interface e classe abstrata eu acredito que você não ficará confuso depois de lê-la
Eu acho que para os programadores que usam linguagens de programação orientadas a objetos, o termo "interface" deve estar familiarizado, mas eu me pergunto se você tem essas dúvidas: qual é o objetivo de uma interface? Qual é a diferença entre ele e as classes abstratas? Classes abstratas podem ser usadas em vez de interfaces? Além disso, como programadores, você deve ouvir a frase "programação orientada para interface", então o que isso significa? Qual é a conotação ideológica? Qual é a relação com a programação orientada a objetos? Este artigo responderá a essas perguntas uma a uma.
1. Qual é a relação entre programação orientada à interface e programação orientada a objetos
Primeiro de tudo, a programação orientada à interface e a programação orientada a objetos não são horizontais. Não é uma idéia de programação independente que é mais avançada do que a programação orientada a objetos, mas é anexada ao sistema de pensamento orientada a objetos e pertence à sua parte. Em outras palavras, é uma das essência do pensamento em sistemas de programação orientados a objetos.
2. A natureza da interface
Uma interface é composta ostensivamente por várias definições de método sem código corporal. Ele tem um nome único e pode ser implementado por uma classe ou outra interface (ou também pode ser considerado herdado). Pode parecer o seguinte em forma:
interface interfacename {void method1 (); Void Method2 (int para1); Método void3 (String Para2, String Para3); }Então, qual é a essência de uma interface? Ou qual é o significado da existência de uma interface? Eu acho que pode ser considerado das duas perspectivas a seguir:
1) Uma interface é um conjunto de regras que especificam um conjunto de regras que uma classe ou interface que implementa essa interface deve ter. Ele incorpora o conceito de natureza de que "se você é ... você deve poder ..."
Por exemplo, na natureza, as pessoas podem comer, isto é, "se você é humano, deve ser capaz de comer". Então, quando simulado em um programa de computador, deve haver uma interface iPerson (personalizada, o nome da interface começa com "i") e existe um método chamado Eat (). Em seguida, estipulamos que todas as classes que representam "humano" devem implementar a interface iPerson, que simula a regra natural de "se você é humano, deve poder comer".
A partir daqui, acho que você também pode ver algumas idéias orientadas a objetos. Um dos núcleos do pensamento orientado a objetos é simular o mundo real e as coisas abstratas no mundo real em categorias. Todo o programa depende de instâncias de vários tipos para se comunicar e cooperar entre si para concluir as funções do sistema. Isso é muito consistente com as condições operacionais do mundo real e também é a essência do pensamento orientado a objetos.
2) Interfaces são representações abstratas de coisas semelhantes em uma certa visão granular. Observe que aqui enfatizo uma certa visão granular, porque o conceito de "a mesma coisa" é relativo e varia devido a diferentes vistas granulares.
Por exemplo, aos meus olhos, sou uma pessoa, e há uma diferença fundamental entre mim e um porco. Posso aceitar a afirmação de que meus colegas de classe e eu somos iguais, mas não devo aceitar que sou o mesmo que um porco. No entanto, se os olhos de um zoólogo são como porcos, eu deveria ser o mesmo, porque somos ambos animais, ele pode pensar que "humanos" e "porco" implementaram a interface Ianimal. Quando ele estuda o comportamento animal, ele não me trata e porcos separadamente, mas o estuda do tamanho maior de partículas de "animal", mas ele pensará que há uma diferença essencial entre mim e uma árvore.
Agora que mudei para um geneticista, a situação é diferente. Como todos os seres vivos podem ser herdados, aos seus olhos, não apenas não sou diferente dos porcos, mas também de um mosquito, uma bactéria, uma árvore, um cogumelo ou mesmo um vírus SARS, porque ele pensaria que todos implementamos a interface IdScendable (nota: descendem vi. A herança), que somos, somos todos os que são todos os que são as coisas. Ele não nos estudará separadamente, mas estudará todos os seres vivos como tipos semelhantes. Aos seus olhos, não há diferença entre humanos e vírus, apenas substâncias hereditárias e substâncias não herdáveis. Mas pelo menos, ainda há uma diferença entre mim e uma pedra.
Infelizmente, porém, um dia, um grande homem apareceu na terra, chamado Lenin. Depois que ele estava familiarizado com a obra-prima do materialismo dialético de Max e Engels, ele tinha muita experiência, então ele deu uma definição famosa: a chamada matéria é uma realidade objetiva que pode ser refletida pela consciência. Nesse ponto, não sou mais diferente de uma pedra, um traço de ar, um idioma e o campo eletromagnético que transmite sinais de telefone móvel, porque aos olhos de Lenin, somos todos realidade objetiva que pode ser refletida pela consciência. Se Lenin fosse um programador, ele diria o seguinte: a chamada matéria é as instâncias geradas por todas as classes que implementam as duas interfaces "Irefllectabe" e "IESSE". (Nota: refletir v. Refletir esse n. Realidade objetiva)
Talvez você pense que meu exemplo acima é um absurdo, mas esse é exatamente o significado da interface. Uma das idéias e núcleo orientados a objetos é o polimorfismo. O que é polimorfismo? Para ser franco, é tratar coisas semelhantes indiscriminadamente em um certo nível de vista granular e lidá -las uniformemente. E a razão pela qual ouso fazer isso é porque há uma interface. Como esse geneticista, ele entendeu que todos os organismos implementaram a interface IdScendable. Desde que sejam organismos, deve haver o método descend (), para que ele possa estudá -los de maneira unificada sem estudar cada organismo separadamente e eventualmente exaustivo.
Talvez não possamos lhe dar uma impressão intuitiva da natureza e função da interface. Em seguida, nos exemplos a seguir e na análise de vários padrões de design, você experimentará a conotação da interface de forma mais intuitiva.
3. Resumo da programação orientada para interface
Através do artigo acima, acho que você entende a conotação ideológica de interfaces e interfaces. Então, o que é programação orientada para interface? Minha definição pessoal é: Na análise e arquitetura do sistema, distinguimos hierarquias e dependências. Cada nível não fornece serviços diretamente à sua camada superior (ou seja, não é instanciada diretamente na camada superior), mas define um conjunto de interfaces, expondo apenas suas funções de interface à camada superior. A camada superior depende apenas da camada inferior e não depende de classes específicas.
Os benefícios de fazer isso são óbvios e, antes de tudo, é muito benéfico para a flexibilidade do sistema. Quando a camada inferior precisa ser alterada, desde que a interface e as funções da interface permaneçam inalteradas, a camada superior não precisa fazer nenhuma modificação. Você pode até substituir a camada inferior sem alterar o código da camada superior, assim como substituímos um disco rígido WD 60G por um disco rígido Seagate 160g. Não há necessidade de fazer alterações em outras partes do computador, mas apenas desconecte o disco rígido original e conecte o novo disco rígido, porque as outras partes do computador não confiam no disco rígido específico, mas apenas dependem de uma interface IDE. Enquanto o disco rígido implementar essa interface, ele poderá ser substituído. A partir daqui, a interface no programa é muito semelhante à interface na realidade, então eu sempre acreditei que a interface da palavra é realmente semelhante!
Outra vantagem do uso de interfaces é que os desenvolvedores de diferentes componentes ou níveis podem iniciar a construção em paralelo, assim como aqueles que constroem discos rígidos não precisam fazer CPUs ou monitores. Enquanto as interfaces forem consistentes e o design for razoável, o desenvolvimento pode ser realizado em paralelo, melhorando assim a eficiência.
Este artigo virá aqui primeiro. Finalmente, gostaria de dizer outra coisa: a essência da orientação a objetos é simular a realidade, que também pode ser considerada a alma do meu artigo. Portanto, pensar mais sobre as coisas orientadas a objetos da realidade será de grande benefício para melhorar a análise do sistema e as capacidades de design.
No próximo artigo, usarei um exemplo para mostrar os métodos básicos de programação de interface.
No terceiro artigo, analisarei algumas idéias de programação orientadas para interface no padrão de design clássico e analisarei as idéias orientadas para a interface na arquitetura hierárquica .NET.
Suplemento a este artigo:
Depois de ler cuidadosamente suas respostas, fico muito feliz em discutir questões técnicas com você. Obrigado a seus amigos que deram afirmação e também aos seus amigos que apresentaram opiniões e perguntas, o que me levou a pensar mais profundamente sobre algo e esperar progredir com isso. Aqui, gostaria de adicionar algo para discutir algumas das questões mais concentradas nas respostas.
1. Em relação às duas palavras "interface" em "Programação orientada para interface" e a linguagem específica de "interface" orientada a objetos
Vi um amigo sugerindo que a palavra "interface" em "programação orientada à interface" deveria ter um intervalo maior que a interface em uma linguagem de programação simples. Depois de pensar nisso, pensei que fazia sentido. O que escrevi aqui é realmente irracional. Eu acho que "interface" na linguagem orientada a objetos refere-se a uma estrutura de código específica, como uma interface definida em C# com a palavra-chave interface. A "interface" em "programação orientada para interface" pode ser considerada um componente estrutural que se refere a um nível mais abstrato da perspectiva da arquitetura de software e de um nível mais abstrato. Nesse sentido, se uma classe abstrata é definida e o objetivo é alcançar o polimorfismo, acho razoável chamar essa classe abstrata também de "interface". Mas é razoável usar classes abstratas para implementar o polimorfismo? Discuta no segundo artigo abaixo.
Em resumo, acho que os conceitos de duas "interfaces" são diferentes e relacionados entre si. As interfaces na "programação orientada para interface" são componentes arquitetônicos no nível ideológico para realizar o polimorfismo, melhorando a flexibilidade e a manutenção do software, enquanto "interfaces" em linguagens específicas são os meios para implementar componentes nessa idéia em código.
2. Sobre classes e interfaces abstratas
Vi que essa era uma questão mais intensa na resposta. Desculpe, eu não estava pensando bem sobre esse problema no artigo. Meu entendimento pessoal dessa questão é o seguinte:
Se olharmos apenas para o código específico, esses dois conceitos são fáceis de serem borrados, e até pensamos que a interface é redundante, porque apenas pela função específica, exceto por herança múltipla (c#, em java), as classes abstratas parecem ser capazes de substituir completamente as interfaces. No entanto, a existência de interfaces para obter herança múltipla? Claro que não. Eu acho que a diferença entre classes abstratas e interfaces é a motivação para usar. O uso de classes abstratas é para reutilização de código, enquanto a motivação para o uso de interfaces é para o polimorfismo. Portanto, se você está hesitando em usar uma interface ou uma classe abstrata em algum lugar, poderá pensar sobre qual é a sua motivação.
Vendo as dúvidas de um amigo sobre a interface iPerson, meu entendimento pessoal é que se a interface iPerson deve ser definida depende do aplicativo específico. If there are Women and Man in our project, both inherit Person, and most of the methods of Women and Man are the same, and there is only one method, DoSomethingInWC() is different (the example is vulgar, please forgive me), then of course, it is more reasonable to define an AbstractPerson abstract class, because it can include all other methods, and the subclass only defines DoSomethingInWC(), which greatly reduces the amount of código duplicado.
No entanto, se as classes de mulheres e homens em nosso programa basicamente não tiverem código comum, e há uma classe de mão -de -obra que precisa instanciá -las e não querer saber se são homens ou mulheres, mas apenas tratam -os como humanos e implementam o polimorfismo, é necessário defini -los como interfaces.
Em suma, a diferença entre uma interface e uma classe abstrata se deve principalmente à motivação para o uso, não por si mesmo. Quando uma coisa deve ser definida como uma classe abstrata ou uma interface, ela deve ser determinada com base no contexto do ambiente específico.
Além disso, acho que outra diferença entre uma interface e uma classe abstrata é que deve haver uma relação geral e especial entre uma classe abstrata e sua subclasse, enquanto uma interface é apenas um conjunto de regras que sua subclasse deve implementar. (Obviamente, pode haver um relacionamento geral e especial, mas o objetivo do uso de interfaces não está aqui.) Por exemplo, é aceitável definir veículos como classes abstratas e carros, aeronaves e navios como subclasses, porque carros, aeronaves e navios são todos veículos especiais. Por exemplo, a interface iComparável apenas diz que as classes que implementam essa interface devem poder ser comparadas, o que é uma regra. Se a classe de carro implementa o ICOMPARABLE, significa apenas que existe uma maneira de comparar duas instâncias de carro, que podem ser mais caras do que o carro ou maior do que o carro. Não importa, mas não podemos dizer que "os carros são especiais e podem ser comparados", o que não é gramaticalmente aplicável.
Espero que este artigo seja útil para a programação Java de todos.