Sdílet prostřednictvím


Částečné třídy (C++/CX)

Částečná třída je konstrukce, která podporuje scénáře, ve kterých upravujete jednu část definice třídy, a automatický software generující kód (například návrhář XAML) také upravuje kód ve stejné třídě. Pomocí částečné třídy můžete návrháři zabránit v přepsání kódu. V projektu partial sady Visual Studio se modifikátor použije automaticky na vygenerovaný soubor.

Syntaxe

Chcete-li definovat částečnou třídu, použijte partial klíčové slovo bezprostředně před klíčem třídy, který by jinak byl normální definicí třídy. Klíčové slovo, jako partial ref class je kontextové klíčové slovo, které obsahuje prázdné znaky. V následujících konstruktech jsou podporovány částečné definice.

  • class nebo struct

  • ref class nebo ref struct

  • value class nebo value struct

  • enum nebo enum class

  • ref interface, interface class, interface structnebo __interface

  • union

Tento příklad ukazuje částečnou ref classčást:

partial ref class MyClass {/* ... */};

Obsah

Částečná definice třídy může obsahovat cokoli, co může úplná definice třídy obsahovat, pokud partial bylo klíčové slovo vynecháno. S jednou výjimkou to zahrnuje všechny platné konstrukty, jako jsou základní třídy, datové členy, členské funkce, výčty, přátelská deklarace a atributy. A jsou povoleny vložené definice statických datových členů.

Jedinou výjimkou je přístupnost třídy. Například příkaz public partial class MyInvalidClass {/* ... */}; je chyba. Všechny specifikátory přístupu, které se používají v definici částečné třídy pro MyInvalidClass, nemají vliv na výchozí přístupnost v následné částečné nebo úplné definici třídy pro MyInvalidClass.

Následující fragment kódu ukazuje přístupnost. V první částečné třídě je veřejná, Method1 protože její přístupnost je veřejná. Ve druhé částečné třídě je soukromá, Method2 protože výchozí přístupnost třídy je soukromá.

partial ref class N 
{
public:
    int Method1(); // Method1 is public.

};
ref class N 
{   
    void Method2(); // Method2 is private.
};

Deklarace

Částečná definice třídy, jako MyClass je pouze deklarace Třídy MyClass. To znamená, že představuje pouze název MyClass. MyClass nelze použít způsobem, který vyžaduje definici třídy, například znalost velikosti MyClass nebo použití základu nebo člena MyClass. MyClass je považována za definovanou pouze v případě, že kompilátor narazí na nečástečně definovanou definici MyClass.

Následující příklad ukazuje chování deklarace částečné třídy. Po deklaraci č. 1 lze použít, MyClass jako by byla zapsána jako předaná deklarace, ref class MyClass;. Deklarace č. 2 je ekvivalentní deklaraci č. 1. Deklarace č. 3 je platná, protože se jedná o předávanou deklaraci do třídy. Deklarace č. 4 je ale neplatná, protože

MyClass není plně definován.

Deklarace č. 5 nepoužívá partial klíčové slovo a deklarace plně definuje MyClass. Deklarace č. 6 je proto platná.

// Declaration #1
partial ref class MyClass {};

// Declaration #2
partial ref class MyClass;

// Declaration #3
MyClass^ pMc; // OK, forward declaration.

// Declaration #4
MyClass mc; // Error, MyClass is not defined.

// Declaration #5
ref class MyClass { };

// Declaration #6
MyClass mc; // OK, now MyClass is defined.

Číslo a řazení

Pro každou úplnou definici třídy může existovat nula nebo více částečných definic tříd.

Každá částečná definice třídy musí lexicky předcházet jedné úplné definici této třídy, ale nemusí předcházet před deklaracemi třídy. Pokud neexistuje žádná úplná definice třídy, můžou být deklarace částečné třídy pouze předávané deklarace.

Všechny klíče třídy, jako class jsou a struct musí se shodovat. Jedná se například o chybu kódu partial class X {}; struct X {};.

Následující příklad ukazuje číslo a řazení. Poslední částečná deklarace selže, protože třída je již definována.

ref class MyClass;  // OK
partial ref class MyClass{};  //OK
partial ref class MyClass{}; // OK
partial ref class MyClass{}; // OK
ref class MyClass{}; // OK
partial ref class MyClass{}; // C3971, partial definition cannot appear after full definition.

Úplná definice

V okamžiku úplné definice třídy X je chování stejné jako v případě, že definice X deklarovala všechny základní třídy, členy atd. v pořadí, v jakém byly zjištěny a definovány v částečných třídách. To znamená, že obsah částečných tříd se považuje za napsané v okamžiku úplné definice třídy a vyhledávání názvů a další jazyková pravidla se použijí v okamžiku úplné definice třídy, jako by byl obsah částečných tříd napsán na místě.

Následující dva příklady kódu mají stejný význam a účinek. První příklad používá částečnou třídu a druhý příklad ne.

ref class Base1 { public: property int m_num; int GetNumBase();};
interface class Base2 { int GetNum(); };
interface class Base3{ int GetNum2();};

partial ref class N : public Base1 
{
public:
    /*...*/

};

partial ref class N : public Base2
{
public:
    virtual int GetNum();
    // OK, as long as OtherClass is
    //declared before the full definition of N
    void Method2( OtherClass^ oc );       
};

ref class OtherClass;

ref class N : public Base3
{    
public:
    virtual int GetNum2();
};

 

ref class OtherClass;
ref class N : public Base1, public Base2, public Base3 
{
public:    
    virtual int GetNum();
    virtual int GetNum2();
private:    
    void Method2(OtherClass^ oc);

};


Šablony

Částečná třída nemůže být šablona.

Omezení

Částečná třída nemůže překročit jednu jednotku překladu.

Klíčové partial slovo je podporováno pouze v kombinaci s klíčovým slovem ref class nebo klíčovým slovem value class .

Příklady

Následující příklad definuje Address třídu napříč dvěma soubory kódu. Návrhář upraví Address.details.h a upraví Address.h. Klíčové slovo používá partial pouze definice třídy v prvním souboru.

// Address.Details.h
partial ref class Address
{
private:
  Platform::String^ street_;
  Platform::String^ city_;
  Platform::String^ state_;
  Platform::String^ zip_;
  Platform::String^ country_;
  void ValidateAddress(bool normalize = true);
};

 

// Address.h
#include "Address.details.h"
ref class Address
{
public:
  Address(Platform::String^ street, Platform::String^ city, Platform::String^ state,
    Platform::String^ zip, Platform::String^ country);
  property Platform::String^ Street { Platform::String^ get(); }
  property Platform::String^ City { Platform::String^ get(); }
  property Platform::String^ State { Platform::String^ get(); }
  property Platform::String^ Zip { Platform::String^ get(); }
  property Platform::String^ Country { Platform::String^ get(); }
};

Viz také

Systém typů
Referenční zdroje k jazyku C++/CX
Referenční informace o oborech názvů