A Digitalmars D programozási nyelv

Absztrakt adattípusok

A D programozási nyelv nem támogatja a többszörös öröklődést. Ehhez hasonló funkcionalitást a Java-hoz hasonlóan interfészeken keresztül tesz lehetővé a nyelv.

Interfészek

Interfész alatt függvények listáját értjük, amit egy osztálynak implementálnia kell, ha megakarja valósítani az adott interfészt. Ha egy adott osztály implementál egy interfészt, akkor az objektumai az implementált interfészre hivatkozó referenciára konvertálhatóak.

Egy interfész nem származhat egy osztályból, csupán más interfészekből. Egy osztály nem származhat egy interfészből egynél többször.

interface D { void foo(); } class A : D, D // error, duplicate interface { }

Interfészeket nem lehet példányosítani.

interface D { void foo(); } ... D d = new D(); // error, cannot create instance of interface

Az interfészek nem implementálhatják a tagfüggvényeiket. Implementálhatnak viszont static és final kulcsszóval ellátott függvényeket.

interface D { void bar(); static void foo() { } final void abc() { } } class C : D { void bar() { } // ok void foo() { } // error, cannot override static D.foo() void abc() { } // error, cannot override final D.abc() }

Ha B osztály származik A-ból, és A megvalósít egy interfészt, de B szintén implementálja, akkor az interfész megvalósítása nem öröklődik az A-ból, azt újra meg kell adni.

interface D { int foo(); } class A : D { int foo() { return 1; } } class B : A, D { } // error, no foo() for interface D

Az interfészek tagfüggvényei rendelkezhetnek szerződéssel, még ha nem is implementálhatjuk magukat a metódusokat. A szerződéseket öröklik az interfészt implementáló osztályok.

interface I { int foo(int i) in { assert(i > 7); } out (result) { assert(result & 1); } void bar(); }

Absztrakt osztályok

Lehetőség van absztrakt osztályok definiálására is az abstract kulcsszóval. Ha egy osztály absztrakt, akkor nem lehet példányosítani. Az absztrakt osztályok átmenetet képeznek az interfészek és a konkrét osztályok között.

Absztrakt osztályt explicit úgy hozhatunk létre, hogy az abstract kulcsszóval definiáljuk, valamint minden olyan osztály absztrakt lesz, amelynek van egy vagy több absztrakt metódusa.

abstract class Foo { abstract void bar(); }