Čá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
nebostruct
ref class
neboref struct
value class
nebovalue struct
enum
neboenum class
ref interface
,interface class
,interface struct
nebo__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ů