Sdílet prostřednictvím


Dědičnost X++

Poznámka:

Skupiny zájmu komunity se teď přesunuly z Yammeru na Microsoft Viva Engage. Pokud se chcete připojit k komunitě Viva Engage a účastnit se nejnovějších diskuzí, vyplňte formulář Žádost o přístup k aplikaci Finance and Operations Viva Engage Community a zvolte komunitu, ke které se chcete připojit.

Tento článek popisuje dědičnost v X++, včetně postupu vytvoření podtřídy a přepsání metody.

Vytvoření podtřídy

Podtřídy jsou třídy, které rozšiřují nebo dědí z jiných tříd. Třída může rozšířit pouze jednu další třídu. Více dědičnosti není podporováno. Pokud rozšíříte třídu, podtřída dědí všechny metody a proměnné v nadřazené třídě ( supertřídu). Podtřídy umožňují opakovaně používat existující kód pro konkrétnější účel. Díky tomu vám ušetří čas během návrhu, vývoje a testování. Chcete-li přizpůsobit chování supertřídy, přepište metody v podtřídě. Supertřída se často označuje jako základní třída a podtřída se často označuje jako odvozená třída.

Příklad podtřídy

Následující příklad nejprve vytvoří třídu s názvem Point. Potom rozšíří třídu Point a vytvoří novou třídu s názvem 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;
    }
}

Zabránění dědičnosti tříd

Pomocí konečného modifikátoru můžete zabránit dědění tříd.

public final class Attribute
{
    int objectField;
}

Přepsání metody

Metody ve třídě jsou zděděny všemi třídami, které rozšiřují třídu. Pokud chcete změnit funkčnost zděděné metody, vytvoříte v podtřídě metodu a pak této metodě udělíte stejný název a parametry jako metoda v supertřídě. Tento proces se označuje jako přepsání metody.

Když vytvoříte instanci podtřídy, můžete odkaz přiřadit proměnné typu supertřídy nebo podtřídy. Bez ohledu na typ proměnné se volá přepsaná metoda.

V následujícím příkladu kódu podtřída přepíše metodu zápisu . Vytvoří se dvě proměnné, oba typy Point . Jeden je přiřazen objekt point , druhý je přiřazen objekt ThreePoint . Při zápis metoda je volána na ThreePoint objektu, threepoint verze metody je volána.

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)".

Zabránění přepsání metod

Statické metody nelze přepsat, protože existují pro každou třídu. Chcete-li chránit jiné citlivé metody nebo základní metody před přepsáním, použijte konečný modifikátor. V následujícím příkladu, protože methodAtt je deklarován jako konečný, nelze přepsat v žádné třídě, která rozšiřuje Atribut. Neměli byste zadávat nové nebo finalizovat metody jako konečné.

Následující příklad ukazuje, jak použít konečné klíčové slovo.

public class Attribute
{
    int objectVariable;

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

Přepsání vs. přetížení

Přepsání nastane, když je implementace metody supertřídy změněna implementací podtřídy této metody, ale podpisy obou metod jsou stejné.

Naproti tomu přetížení nastane, když má více než jedna metoda stejný název, ale metody mají různé podpisy (návratové typy, seznamy parametrů nebo obojí). X++ podporuje přepsání, ale nepodporuje přetížení.