X++ inheritance

Selles artiklis kirjeldatakse pärilust rakenduses X++, sh seda, kuidas luua alamklassi ja alistada meetod.

Alamklassi loomine

Alamklassid on klassid , mis laiendavad või pärivad teistest klassidest. Klass saab laiendada ainult ühte teist klassi. Mitut pärimist ei toetata. Klassi laiendamisel pärib alamklass kõik emaklassi ( superklass) meetodid ja muutujad. Alamklasside abil saate olemasolevat koodi konkreetsemal eesmärgil uuesti kasutada. Seetõttu aitavad need teil disaini, arenduse ja testimise ajal aega säästa. Superklassi käitumise kohandamiseks alistage alamklassi meetodid. Superklass on sageli tuntud kui baasklass ja alamklass on sageli tuletatud klass.

Subclass example

Järgmises näites luuakse esmalt klass nimega Punkt. Seejärel laiendatakse punktiklassi , et luua uus klass nimega ThreePoint.

class Point
{
    // Instance fields.
    real x; 
    real y; 

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    { 
        x = _x;
        y = _y;
    }
}

class ThreePoint extends Point
{
    // Additional instance fields z. Fields x and y are inherited.
    real z; 

    // Constructor is overridden to initialize z.
    void new(real _x, real _y, real _z)
    {
        // Initialize the fields.
        super(_x, _y); 
        z = _z;
    }
}

Klassi pärimise takistamine

Klasside pärimist saate takistada lõpliku muutefunktsiooni abil.

public final class Attribute
{
    int objectField;
}

Meetodi alistamine

Klassi meetodid pärivad kõik klassi laiendavad meetodid. Päritud meetodi funktsionaalsuse muutmiseks loote alamklassis meetodi ja määrate sellele meetodile superklassis sama nime ja parameetrid. Seda toimingut nimetatakse meetodi alistamiseks .

Alamklassi lähtestamisel saate määrata viite kas superklassi tüübi muutujale või alamklassi tüübile. Olenemata muutuja tüübist kutsutakse alistatud meetod.

Järgmises näites alistab alamklass kirjutamismeetodi . Luuakse kaks muutujat, mille tüüp on Point . Ühele määratakse Punkt-objekt , teisele määratakse objekt ThreePoint . Kui kirjutusmeetod kutsutakse ThreePointi objektil, kutsutakse meetodi ThreePointi versioon.

class Point
{
    // Instance fields.
    real x;
    real y;

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    {
        x = _x;
        y = _y;
    }

    void write()
    {
        info("(" + any2Str(x) + ", " + any2Str(y) + ")");
    }
}

class ThreePoint extends Point
{
    // Additional instance fields z. Fields x and y are inherited.
    real z;

    // Constructor is overridden to initialize z.
    void new(real _x, real _y, real _z)
    {
        // Initialize the fields.
        super(_x, _y);
        z = _z;
    }

    void write()
    {
        info("(" + any2Str(x) + ", " + any2Str(y) + ", " + any2Str(z) + ")");
    }

}

// Code that creates Point objects and calls the write method.
Point point2 = new Point(1.0, 2.0);
Point point3 = new ThreePoint(3.0, 4.0, 5.0);

point2.write();
// Output is "(1.0, 2.0)".

point3.write();
// Output is "(3.0, 4.0, 5.0)".

Meetodi alistamise vältimine

Staatilisi meetodeid ei saa alistada, kuna need on olemas iga klassi kohta. Muude tundlike meetodite või põhimeetodite alistamiseks kasutage viimast muutefunktsiooni. Järgmises näites ei saa alistada seda klassis, mis alistab atribuudi atribuudi, kuna methodAtt on lõplikuks tunnistatud. Ärge määrake uusi ega viimistletud meetodeid lõpetatuks.

Järgmises näites kirjeldatakse lõpliku märksõna kasutamist.

public class Attribute
{
    int objectVariable;

    final void methodAtt()
    {
        //Some statements
    }
}

Alistamine vs ülekoormamine

Alistamine toimub siis, kui alamklass muudab meetodi superklassi rakendamist, kuid mõlemal meetodil on sama allkiri.

Ülekoormamine toimub seevastu siis, kui mitmel meetodil on sama nimi, kuid meetoditel on erinevad allkirjad (tagastustüübid, parameetriloendid või mõlemad). X++ toetab ülekoormamist, kuid ei toeta ülekoormamist.