Tipo abstrato - Abstract type

Em linguagens de programação , um tipo abstrato é um tipo em um sistema de tipos nominativos que não pode ser instanciado diretamente; um tipo que não é abstrato - que pode ser instanciado - é chamado de tipo concreto . Cada instância de um tipo abstrato é uma instância de algum subtipo concreto . Os tipos abstratos também são conhecidos como tipos existenciais .

Um tipo abstrato pode fornecer nenhuma implementação ou uma implementação incompleta. Em algumas linguagens, os tipos abstratos sem implementação (em vez de uma implementação incompleta) são conhecidos como protocolos , interfaces , assinaturas ou tipos de classe . Na programação orientada a objetos baseada em classes , os tipos abstratos são implementados como classes abstratas (também conhecidas como classes básicas abstratas ) e os tipos concretos como classes concretas . Na programação genérica , a noção análoga é um conceito , que especifica de forma semelhante a sintaxe e a semântica, mas não requer um relacionamento de subtipo: dois tipos não relacionados podem satisfazer o mesmo conceito.

Freqüentemente, os tipos abstratos terão uma ou mais implementações fornecidas separadamente, por exemplo, na forma de subtipos concretos que podem ser instanciados. Na programação orientada a objetos, uma classe abstrata pode incluir métodos abstratos ou propriedades abstratas que são compartilhadas por suas subclasses. Outros nomes para recursos de linguagem que são (ou podem ser) usados ​​para implementar tipos abstratos incluem características , mixins , sabores , funções ou classes de tipo .

Significando tipos abstratos

Classes abstratas podem ser criadas, significadas ou simuladas de várias maneiras:

  • Pelo uso da palavra-chave explícita abstractna definição da classe, como em Java , D ou C # .
  • Incluindo, na definição da classe, um ou mais métodos abstratos (chamados funções virtuais puras em C ++ ), que a classe é declarada aceitar como parte de seu protocolo, mas para os quais nenhuma implementação é fornecida.
  • Ao herdar de um tipo abstrato, e não substituir todas as características ausentes necessárias para completar a definição de classe. Em outras palavras, um tipo filho que não implementa todos os métodos abstratos de seu pai torna-se ele mesmo abstrato.
  • Em muitas linguagens tipadas dinamicamente, como Smalltalk , qualquer classe que envia um método específico para isso , mas não implementa esse método, pode ser considerada abstrata. (No entanto, em muitas dessas linguagens, como Objective-C , o erro não é detectado até que a classe seja usada, e a mensagem retorna os resultados em uma mensagem de erro de exceção, como "Não reconhece o seletor: xxx", conforme - [NSObject doesNotRecognizeSelector:(SEL)selector]é invocado na detecção de um método não implementado).

Exemplo (Java)

//By default, all methods in all classes are concrete, unless the abstract keyword is used.
abstract class Demo {
    // An abstract class may include abstract methods, which have no implementation.
    abstract public int sum(int x, int y);

    // An abstract class may also include concrete methods.
    public int product(int x, int y) { return x*y; }
}

//By default, all methods in all interfaces are abstract, unless the default keyword is used.
interface DemoInterface {
    [abstract] int getLength(); //Abstract can be used here, though is completely useless
    
    //The default keyword can be used in this context to specify a concrete method in an interface
    default int product(int x, int y) {
        return x * y;
    }
}

Uso de tipos abstratos

Tipos abstratos são um recurso importante em linguagens OOP tipadas estaticamente . Muitas linguagens digitadas dinamicamente não possuem recurso equivalente (embora o uso de digitação duck torne os tipos abstratos desnecessários); no entanto, os traços são encontrados em algumas linguagens modernas com tipagem dinâmica.

Alguns autores argumentam que as classes devem ser classes folha (não têm subtipos), ou então ser abstratas.

Os tipos abstratos são úteis porque podem ser usados ​​para definir e impor um protocolo ; um conjunto de operações que todos os objetos que implementam o protocolo devem suportar.

Os tipos abstratos também são uma parte essencial do Template Method Pattern .

Veja também

Referências

Leitura adicional

links externos

  • "Explicação sobre interfaces abstratas ou esqueléticas" [1]
  • Tipos e linguagens de programação de Benjamin Pierce (MIT Press 2002) [2]
  • Tipo abstrato em Rosetta Code