Abstrakt typ - Abstract type

I programmeringsspråk är en abstrakt typ en typ i ett nominativt typsystem som inte kan direkt instanseras ; en typ som inte är abstrakt - som kan instantieras - kallas en konkret typ . Varje förekomst av en abstrakt typ är en förekomst av någon konkret undertyp . Abstrakta typer är också kända som existentiella typer .

En abstrakt typ kanske inte ger någon implementering eller en ofullständig implementering. På vissa språk är abstrakta typer utan implementering (snarare än en ofullständig implementering) kända som protokoll , gränssnitt , signaturer eller klasstyper . I klassbaserad objektorienterad programmering implementeras abstrakttyper som abstrakta klasser (även kända som abstrakta basklasser ) och konkreta typer som konkreta klasser . I generisk programmering är det analoga begreppet ett begrepp , som på samma sätt specificerar syntax och semantik, men inte kräver en subtypsrelation: två orelaterade typer kan tillfredsställa samma koncept.

Ofta kommer abstrakta typer att ha en eller flera implementeringar som tillhandahålls separat, till exempel i form av konkreta undertyper som kan instantieras. I objektorienterad programmering kan en abstrakt klass innehålla abstrakta metoder eller abstrakta egenskaper som delas av dess underklasser. Andra namn på språkfunktioner som används (eller kan användas) för att implementera abstrakta typer inkluderar egenskaper , mixins , smaker , roller eller typklasser .

Betecknar abstrakta typer

Abstrakta klasser kan skapas, betecknas eller simuleras på flera sätt:

  • Genom att använda det uttryckliga sökordet abstract i klassdefinitionen, som i Java , D eller C# .
  • Genom att inkludera, i klassdefinitionen, en eller flera abstrakta metoder (kallade rena virtuella funktioner i C ++ ), som klassen deklareras acceptera som en del av sitt protokoll, men för vilka ingen implementering tillhandahålls.
  • Genom att ärva från en abstrakt typ, och inte åsidosätta alla saknade funktioner som är nödvändiga för att slutföra klassdefinitionen. Med andra ord, en barntyp som inte implementerar alla abstrakta metoder från sin förälder blir själv abstrakt.
  • På många dynamiskt skrivna språk som Smalltalk kan varje klass som skickar en viss metod till detta , men inte implementerar den metoden, betraktas som abstrakt. (Men på många sådana språk, som Objective-C , upptäcks inte felet förrän klassen används, och meddelandet returnerar ett undantagsfelmeddelande som "Känner inte igen väljaren: xxx" som - [NSObject doesNotRecognizeSelector:(SEL)selector]aktiveras vid upptäckt en oimplementerad metod).

Exempel (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;
    }
}

Användning av abstrakta typer

Abstrakta typer är en viktig funktion i statiskt skrivna OOP -språk. Många dynamiskt skrivna språk har ingen motsvarande funktion (även om användning av ankskrivning gör abstrakta typer onödiga); men egenskaper finns i några moderna dynamiskt skrivna språk.

Vissa författare hävdar att klasser ska vara bladklasser (inte ha några undertyper) eller att de ska vara abstrakta.

Abstrakta typer är användbara genom att de kan användas för att definiera och genomdriva ett protokoll ; en uppsättning operationer som alla objekt som implementerar protokollet måste stödja.

Abstrakta typer är också en viktig del av mallmetodmönstret .

Se även

Referenser

Vidare läsning

externa länkar

  • "Abstrakta eller skelettgränssnitt förklarade" [1]
  • Typer och programmeringsspråk av Benjamin Pierce (MIT Press 2002) [2]
  • Abstrakt typ Rosetta Code