Sdílet prostřednictvím


Deklarace spravovaného typu třídy

Způsob jakým deklarovat odkazovaný typ třídy se změnilo ze způsobů ze Správce rozšíření pro C++ na způsob z Visual C++ 2010.

Ve spravovaném rozšíření začíná odkazovaný typ třídy klíčovým slovem __gc. V nové syntaxi je klíčové slovo __gc nahrazeno jedním ze dvou rozložených klíčových slov: ref class nebo ref struct. Volba struct nebo class označuje veřejnou (pro struct) nebo soukromou (pro class) výchozí úroveň přístupu ke svým členům deklarovaných v počáteční neoznačené sekci těla typu.

Podobně ve spravovaném rozšíření je hodnota typu třídy uvozená klíčovým slovem __value. V nové syntaxi je klíčové slovo __value nahrazeno jedním ze dvou rozložených klíčových slov: value class nebo value struct.

Typ rozhraní byl ve spravovaném rozšíření označen klíčovým slovem __interface. V nové syntaxi je toto nahrazeno interface class.

Například následující deklarace třídy ve spravovaném rozšíření:

public __gc class Block {};     // reference class
public __value class Vector {}; // value class
public __interface IFooBar {};  // interface class

V nové syntaxi jsou tyto deklarace ekvivalentně deklarovány takto:

public ref class Block {};         // reference class
public value class Vector {};      // value class
public interface class IFooBar {}; // interface class

Specifikace abstaraktní třídy

Podle spravovaného rozšíření se umístí klíčové slovo __abstract před klíčové slovo class (před nebo po __gc) k označení neúplné třídy a že objekty třídy nemohou být vytvořeny uvnitř programu:

public __gc __abstract class Shape {};
public __gc __abstract class Shape2D: public Shape {};

V nové syntaxi zadáte kontextové klíčové slovo abstract, následuje název třídy a před tělo třídy se umístí seznam odvození základní třídy nebo středník.

public ref class Shape abstract {};
public ref class Shape2D abstract : public Shape{};

Sémantický význam je samozřejmě beze změny.

Specifikace zapouzdřené třídy

V rámci spravovaného rozšíření umístíte klíčové slovo __sealed před klíčové slovo class (buď před nebo po __gc) k označení objektů třídy, které nemůžou být zděděny z:

public __gc __sealed class String {};

V nové syntaxi zadáte kontextové klíčové slovo sealed, následuje název třídy a před tělo třídy se umístí seznam odvození základní třídy nebo středník.

Můžete třídu jak odvodit, tak zapouzdřit. Například třída String je implicitně odvozena z Object. Výhodou zapouzdření třídy je podpora statického rozlišení (tedy v době kompilace) všech volání virtuálních funkcí prostřednictvím objektu zapečetěné okazované třídy. Důvodem je specifikátor sealed zaručující, že sledovací popisovač String nemůže odkazovat na následně odvozené třídy, které mohou poskytovat přetěžující instance virtuální metody, jenž je vyvolána. Zde je příklad zapečetěné třídy v nové syntaxi:

public ref class String sealed {};

Také můžete specifikovat třídu jako abstraktní i zapečetěnou – toto je zvláštní podmínka, která označuje statickou třídu. To je popsáno v dokumentaci CLR takto:

„Typ, který je abstract i sealed by měl mít pouze statické členy a slouží jako, jak to některé jazyky nazývají, obor názvů."

Zde je například deklarace abstraktně zapečetěné třídy pomocí syntaxe spravovaného rozšíření:

public __gc __sealed __abstract class State {
public:
   static State() {}
   static bool inParamList();

private:
   static bool ms_inParam;
};

a zde je tato deklarace přeložena do nové syntaxe:

public ref class State abstract sealed {
public:
   static State();
   static bool inParamList();

private:
   static bool ms_inParam;
};

Dědičnost CLR Specifikace základní třídy

V rámci objektového modelu CLR je podporována pouze veřejná jednoduchá dědičnost. Ale spravované rozšíření zachovává výchozí výklad ISO C++ základní třídy bez přístupového klíčového slova, jako určení soukromého odvození. To znamenalo, že každá deklarace dědičnosti CLR musela poskytovat klíčové slovo public k přetížení výchozí interpretace.

// Managed Extensions: error: defaults to private derivation
__gc class Derived : Base {};

V nové definici syntaxe neexistence klíčového slova označuje veřejné odvození v definici dědičnosti CLR. Proto je přístupové klíčové slovo public nyní volitelné. Zatímco to nevyžaduje žádnou úpravu spravovaného rozšíření pro kód jazyka C++, pro úplnost jsem zde umístil seznam těchto změn.

// New syntax: ok: defaults to public derivation
ref class Derived : Base{};

Viz také

Odkaz

Classes and Structs (Managed)

abstract (Visual C++)

sealed

Koncepty

Typy spravovaných (C + +/ CL)