Aqui estão as breves definições de encapsulamento e abstração.
Abstração:
O processo de abstração em Java é usado para ocultar certos detalhes e mostrar apenas os recursos essenciais do objeto. Em outras palavras, ele lida com a visão externa de um objeto (interface). O único bom exemplo que vejo para isso em sites diferentes é a interface.
Encapsulamento:
Trata-se basicamente de ocultar o estado do objeto com a ajuda de modificadores como privado, público, protegido etc.
O que nós conseguimos com modificadores como private
, public
também esconde detalhes desnecessários de fora o mundo do lado que não é nada, mas também um conceito de abstração
Portanto, a partir da explicação acima, parece que o encapsulamento faz parte da abstração ou podemos dizer que é um subconjunto da abstração. Mas por que então o termo encapsulamento é inventado quando podemos lidar apenas com abstração? Estou certo de que deve haver alguma diferença importante que os distinga, mas a maior parte do material na rede diz quase a mesma coisa para os dois.
Embora essa questão tenha sido levantada neste fórum também, mas estou postando novamente com dúvidas específicas. Algumas respostas também dizem que abstração é um conceito e encapsulamento é implementação. Mas eu não compro isso - se é verdade, posso pensar que esses dois conceitos diferentes são fornecidos para nos confundir.
Atualização: - Após 5 anos, criei minha própria resposta, qual é a essência com base nas respostas deste post e abaixo
An 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
private
public
, como eles fornecem apenas informações / ocultação de dados, o que fazemos porque é uma boa prática proteger os dados da instância.Respostas:
Encapsulamento é uma estratégia usada como parte da abstração. Encapsulamento refere-se ao estado dos objetos - os objetos encapsulam seu estado e o ocultam do exterior; usuários externos da classe interagem com ela através de seus métodos, mas não podem acessar diretamente o estado das classes. Portanto, a classe abstrai os detalhes da implementação relacionados ao seu estado.
Abstração é um termo mais genérico, que também pode ser alcançado por (entre outros) subclasses. Por exemplo, a interface
List
na biblioteca padrão é uma abstração para uma sequência de itens, indexados por sua posição, exemplos concretos de aList
são aArrayList
ou aLinkedList
. Código que interage com osList
resumos sobre os detalhes de que tipo de lista está usando.A abstração geralmente não é possível sem ocultar o estado subjacente pelo encapsulamento - se uma classe expõe seu estado interno, não pode mudar seu funcionamento interno e, portanto, não pode ser abstraída.
fonte
Abstração é o conceito de descrever algo em termos mais simples, ou seja, abstraindo os detalhes, a fim de focar no que é importante (isso também é visto na arte abstrata, por exemplo, onde o artista se concentra nos blocos de construção de imagens, como cores ou formas). A mesma idéia se traduz em POO usando uma hierarquia de herança, onde conceitos mais abstratos estão no topo e idéias mais concretas, no fundo, constroem suas abstrações. No nível mais abstrato, não há detalhes de implementação e talvez muito poucos pontos em comum, que são adicionados à medida que a abstração diminui.
Por exemplo, na parte superior, pode haver uma interface com um único método, depois o próximo nível, fornece várias classes abstratas, que podem ou não preencher alguns detalhes sobre o nível superior, mas ramificam adicionando seus próprios métodos abstratos , então, para cada uma dessas classes abstratas, há classes concretas que fornecem implementações de todos os métodos restantes.
Encapsulamento é uma técnica . Pode ou não ser para ajudar na abstração, mas certamente trata-se de ocultar e / ou organização de informações. Exige que os dados e as funções sejam agrupados de alguma forma - é claro que as boas práticas de POO exigem que eles sejam agrupados por abstração. No entanto, existem outros usos que apenas ajudam na manutenção etc.
fonte
São conceitos diferentes.
Abstração é o processo de refinar todos os atributos desnecessários / sem importância de um objeto e manter apenas as características mais adequadas ao seu domínio.
Por exemplo, para uma pessoa: você decide manter o nome e o sobrenome e o SSN. Idade, altura, peso, etc, são ignorados como irrelevantes.
Abstração é onde seu design começa.
Ou seja, dados e métodos são agrupados.
fonte
O encapsulamento está ocultando dados desnecessários em uma cápsula ou unidade
Abstração está mostrando o recurso essencial de um objeto
O encapsulamento é usado para ocultar seu membro da classe e da interface externas. Usando modificadores de acesso fornecidos em c #. Como exemplo público, privado, protegido etc.
Aqui, agrupamos os dados em uma unidade ou cápsula, ou seja, Classe.
A abstração é usada para mostrar dados importantes e relevantes para o usuário. melhor exemplo do mundo real Em um telefone celular, você vê seus diferentes tipos de funcionalidades como câmera, mp3 player, função de chamada, função de gravação, multimídia etc. É abstração, porque você está vendo apenas informações relevantes em vez da engenharia interna.
fonte
Abstração é um termo muito geral, e abstração em software não se limita a linguagens orientadas a objetos. Uma definição de dicionário: "o ato de considerar algo como uma qualidade ou característica geral, além de realidades concretas, objetos específicos ou instâncias reais".
A linguagem assembly pode ser vista como uma abstração do código da máquina - a assembly expressa os detalhes e a estrutura essenciais do código da máquina, mas evita que você precise pensar nos opcodes usados, no layout do código na memória, fazendo saltar para o endereço certo etc.
A API do seu sistema operacional é uma abstração da máquina subjacente. Seu compilador fornece uma camada de abstração que protege você dos detalhes da linguagem assembly. A pilha TCP / IP incorporada ao seu sistema operacional abstrai os detalhes da transmissão de bits em uma rede. Se você vai até o silício bruto, as pessoas que projetaram sua CPU o fizeram usando diagramas de circuitos escritos em termos de "diodos" e "transistores", que são abstrações de como os elétrons viajam através de cristais semicondutores.
No software, tudo é uma abstração. Criamos programas que simulam ou modelam algum aspecto da realidade, mas, por necessidade, nossos modelos sempre abstraem alguns detalhes da "coisa real". Construímos camada sobre camada sobre camada de abstrações, porque é a única maneira de realizar qualquer coisa. (Imagine que você estava tentando criar, por exemplo, um solucionador de sudoku, e teve que projetá-lo usando apenas cristais semicondutores. "OK, preciso de um pedaço de silício do tipo N aqui ...")
Em comparação, "encapsulamento" é um termo muito específico e limitado. Algumas das outras respostas a esta pergunta já deram boas definições para ela.
fonte
Respondendo a minha própria pergunta após 5 anos, pois ainda sinto que ainda preciso de mais detalhes
Abstração:
Definição técnica: - Abstração é um conceito para ocultar detalhes desnecessários (complexos ou simples) e mostrar apenas os recursos essenciais do objeto. Não há implementação aqui, é apenas um conceito
Na prática, o que isso significa: - Quando digo que minha empresa precisa de algum meio / dispositivo para que os funcionários possam se conectar ao cliente. Esta é a forma mais pura de abstação (como a interface em java), pois esse dispositivo / mídia pode ser telefone ou internet ou skype ou pessoalmente ou e-mail etc. Não vou entrar em detalhes do dispositivo / mídia
Mesmo quando digo que minha empresa precisa de algum meio / dispositivo para que os funcionários possam se conectar ao cliente por meio de chamada de voz. Então também estou falando abstrato, mas em um nível um pouco mais baixo, como dispositivo / meio pode ser telefone ou skype ou algo mais, etc.
Agora, quando digo que minha empresa precisa de um telefone para que os funcionários possam se conectar ao cliente por meio de chamadas de voz. Então também estou falando abstrato, mas em um nível um pouco mais baixo, pois o telefone pode ser de qualquer empresa, como iphone, samsung ou nokia, etc.
Encapsulamento: - Trata-se basicamente de ocultar o estado (informação) do objeto com a ajuda de modificadores como privado, público, protegido etc., expomos o estado através de métodos públicos somente se necessário.
O que significa praticamente: - Agora, quando digo que minha empresa precisa de algum iphone para que os funcionários possam se conectar ao cliente por meio de uma chamada de voz. Agora, estou falando de algum objeto concreto (como o iphone). Mesmo que eu não esteja indo para o nitty gritty do iphone aqui também, o iphone tem algumas informações / implementações de estado / concreto associadas a ele, onde o dispositivo / mídia não possui. Quando digo objeto concreto, na verdade significa qualquer objeto que tenha alguma implementação / informação (não completa, como a classe java abstract) associada a ele.
Então, o iphone realmente usou aqui o encapsulamento como estratégia para ocultar seu estado / informação e expor apenas os que acha que deveriam ser expostos. Portanto, a abstração e o encapsulamento ocultam alguns detalhes desnecessários, mas a abstração no nível do conceito e o encapsulamento, na verdade, no nível da implementação
Esta é a essência com base nas respostas deste post e abaixo
fonte
Encapsulamento - o processo de ocultar componentes da classe para impedir o acesso direto de fora. Isso é alcançado usando o modificador "privado" para impedir o acesso direto a alguns membros da classe (campo ou método de dados) de outras classes ou objetos, enquanto fornece acesso a esses membros privados por membros públicos (Interface). Isso torna os alunos protegidos como órgãos humanos ocultos / encapsulados sob a pele ou algum escudo.
Abstração - Um princípio deve ser seguido por escrito no programa OOP que diz "você deve incluir na classe apenas componentes que sejam interessantes na tarefa do programa". Por exemplo: o objeto que o aluno possui muitos caracteres como humano: nome, idade, peso, cor do cabelo, cor dos olhos etc. Mas, quando você cria uma aula no OOP para trabalhar com os alunos, deve incluir apenas os caracteres que realmente importa para o banco de dados do aluno: nome, idade, especialidade, nível, marcas ... etc. Em C ++, você pode criar uma classe abstrata usando o modificador "virtual" com qualquer método da classe e que o tornará inutilizável diretamente, mas você pode derivar outras classes dele e criar implementação para seus membros, adicionando membros necessários com base na tarefa.
fonte
Foi assim que eu entendi:
Na programação orientada a objetos, temos algo chamado classes . Para que servem? Eles devem armazenar algum estado e armazenar alguns métodos para mudar esse estado, ou seja, eles são encapsulando o estado e seus métodos.
Ele (classe) não se importa com a visibilidade própria ou de seu conteúdo. Se optarmos por ocultar o estado ou alguns métodos, é ocultação de informações .
Agora, pegue o cenário de uma herança . Temos uma classe base e algumas classes derivadas (herdadas). Então, o que a classe base está fazendo aqui? Isto é abstraindo algumas coisas das classes derivadas.
Todos eles são diferentes, certo? Mas, nós os misturamos para escrever bons programas orientados a objetos. Espero que ajude :)
fonte
Delineamentos de abstração uma representação simplificada específica de contexto; ignora detalhes contextualmente irrelevantes e inclui detalhes contextualmente importantes.
O encapsulamento restringe o acesso externo às partes de algo e agrupa o estado dessa coisa com os procedimentos que usam o estado.
Pegue as pessoas, por exemplo. No contexto da cirurgia, uma abstração útil ignora as crenças religiosas de uma pessoa e inclui o corpo da pessoa. Além disso, as pessoas encapsulam suas memórias com os processos de pensamento que as usam. Uma abstração não precisa ter encapsulamento; por exemplo, uma pintura de uma pessoa não esconde suas partes nem agrupa procedimentos com seu estado. E, o encapsulamento não precisa ter uma abstração associada; por exemplo, pessoas reais (não abstratas) encapsulam seus órgãos com seu metabolismo.
fonte
NOTA: Estou compartilhando isso. Não significa que aqui não seja uma boa resposta, mas porque eu entendi facilmente.
Responda:
Quando uma classe é conceitualizada, quais são as propriedades que podemos ter nela, dado o contexto. Se estivermos projetando uma classe Animal no contexto de um zoológico, é importante que tenhamos um atributo como animalType para descrever doméstico ou selvagem. Esse atributo pode não fazer sentido quando projetamos a classe em um contexto diferente.
Da mesma forma, quais são os comportamentos que teremos na classe? A abstração também é aplicada aqui. O que é necessário ter aqui e o que será uma overdose? Depois, cortamos algumas informações da classe. Este processo está aplicando abstração.
Quando pedimos a diferença entre encapsulamento e abstração, eu diria que o encapsulamento usa abstração como conceito. Então, é apenas um encapsulamento. Não, abstração é mesmo um conceito aplicado como parte de herança e polimorfismo.
Vá aqui para obter mais explicações sobre este tópico.
fonte
Vamos tentar entender de uma maneira diferente.
O que pode acontecer se a Abstração não estiver lá e O que pode acontecer se o Encapsulamento não estiver lá.
Se a Abstração não estiver lá, você poderá dizer que o objeto está usando menos. Você não pode identificar o objeto nem acessar nenhuma funcionalidade dele. Tomemos um exemplo de uma TV, se você não tiver a opção de ligar, mudar de canal, aumentar ou diminuir o volume etc., então qual é o uso da TV e como usá-la?
Se o encapsulamento não estiver lá ou não estiver sendo implementado corretamente, você poderá usar incorretamente o objeto. Lá por dados / componentes podem ser mal utilizados. Tome o mesmo exemplo de TV. Se não houver encapsulamento no volume da TV, o controlador de volume poderá ser mal utilizado fazendo com que fique abaixo ou ultrapasse seu limite (0-40 / 50).
fonte
O encapsulamento protege para recolher o comportamento interno do objeto / instância da entidade externa. Portanto, um controle deve ser fornecido para confirmar que os dados que estão sendo fornecidos não prejudicam o sistema interno da instância / objeto para sobreviver à sua existência.
Bom exemplo, Divider é uma classe que possui duas variáveis de instância dividend e divisor e um método getDividedValue.
Você pode pensar que, se o divisor estiver definido como 0, o sistema / comportamento interno (getDivided) será interrompido.
Portanto, o comportamento interno do objeto pode ser protegido lançando uma exceção por meio de um método
fonte
em uma frase simples, posso dizer: A essência da abstração é extrair propriedades essenciais enquanto omitimos detalhes não essenciais. Mas por que devemos omitir detalhes não essenciais? O principal motivador é evitar o risco de mudança. Você pode considerar que a abstração é igual ao encapsulamento. Mas encapsulamento significa o ato de incluir um ou mais itens em um contêiner, sem ocultar detalhes. Se você argumentar que "tudo o que foi encapsulado também estava oculto". Obviamente isso não é verdade. Por exemplo, mesmo que as informações possam ser encapsuladas dentro de estruturas e matrizes de registros, essas informações geralmente não estão ocultas (a menos que ocultas por meio de outro mecanismo).
fonte