Aracılığıyla paylaş


Kısmi Sınıflar (C++/CX)

Kısmi sınıf, sınıf tanımının bir bölümünü değiştirdiğiniz senaryoları destekleyen bir yapıdır ve otomatik kod oluşturma yazılımı (örneğin, XAML tasarımcısı) aynı sınıftaki kodu da değiştirir. Kısmi bir sınıf kullanarak tasarımcının kodunuzun üzerine yazmasını engelleyebilirsiniz. Visual Studio projesinde partial , değiştirici oluşturulan dosyaya otomatik olarak uygulanır.

Sözdizimi

Kısmi bir sınıf tanımlamak için, aksi takdirde normal bir sınıf tanımının sınıf anahtarından hemen önce anahtar sözcüğünü kullanın partial . gibi partial ref class bir anahtar sözcük, boşluk karakterleri içeren bağlamsal bir anahtar sözcüktür. Kısmi tanımlar aşağıdaki yapılarda desteklenir.

  • class veya struct

  • ref class veya ref struct

  • value class veya value struct

  • enum veya enum class

  • ref interface, interface class, interface structveya __interface

  • union

Bu örnekte kısmi ref classbir gösterilmektedir:

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

İçindekiler

Kısmi bir sınıf tanımı, anahtar sözcüğü atlanmışsa tam sınıf tanımının partial içerebileceği herhangi bir şeyi içerebilir. Bir özel durum dışında, temel sınıflar, veri üyeleri, üye işlevleri, sabit listeleri, arkadaş bildirimleri ve öznitelikler gibi geçerli yapıları içerir. Statik veri üyelerinin satır içi tanımlarına da izin verilir.

Tek özel durum sınıf erişilebilirliğidir. Örneğin, deyimi public partial class MyInvalidClass {/* ... */}; bir hatadır. MyInvalidClass için kısmi sınıf tanımında kullanılan erişim tanımlayıcıları, MyInvalidClass için sonraki bir kısmi veya tam sınıf tanımında varsayılan erişilebilirliği etkilemez.

Aşağıdaki kod parçası erişilebilirliği gösterir. İlk kısmi sınıfta, Method1 erişilebilirliği genel olduğundan geneldir. İkinci kısmi sınıfta, Method2 varsayılan sınıf erişilebilirliği özel olduğundan özeldir.

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

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

Bildirim

gibi MyClass bir sınıfın kısmi tanımı yalnızca MyClass bildirimidir. Yani, yalnızca adını MyClasstanıtır. MyClass bir sınıf tanımı gerektiren bir şekilde kullanılamaz; örneğin, boyutunu MyClass bilmek veya temel veya üyesini MyClasskullanmak. MyClass yalnızca derleyicinin kısmi olmayan bir tanımıyla MyClasskarşılaştığında tanımlandığı kabul edilir.

Aşağıdaki örnek, kısmi bir sınıfın bildirim davranışını gösterir. 1. bildirimden sonra, MyClass ileri bildirim ref class MyClass;olarak yazılmış gibi kullanılabilir. 2. bildirim, 1. bildirimle eşdeğerdir. 3. bildirim, bir sınıfa iletme bildirimi olduğundan geçerlidir. Ancak 4. bildirim geçersiz çünkü

MyClass tam olarak tanımlanmamıştır.

5. bildirim anahtar sözcüğünü partial kullanmaz ve bildirimi tam olarak tanımlar MyClass. Sonuç olarak, bildirim #6 geçerlidir.

// 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.

Numara ve sıralama

Bir sınıfın her tam tanımı için sıfır veya daha fazla kısmi sınıf tanımı olabilir.

Bir sınıfın tüm kısmi sınıf tanımları, bu sınıfın tek bir tam tanımından önce sözcük temelli olarak olmalıdır, ancak sınıfın ileriye dönük bildirimlerinden önce olması gerekmez. Sınıfın tam tanımı yoksa, kısmi sınıf bildirimleri yalnızca iletme bildirimleri olabilir.

ve gibi classstruct tüm sınıf anahtarları eşleşmelidir. Örneğin, kodu partial class X {}; struct X {};için bir hatadır.

Aşağıdaki örnekte sayı ve sıralama gösterilmektedir. Sınıfı zaten tanımlanmış olduğundan son kısmi bildirim başarısız olur.

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.

Tam tanım

X sınıfının tam tanımı noktasında, davranış, X'in tanımı tüm temel sınıfları, üyeleri vb. ile karşılaşıldıkları ve kısmi sınıflarda tanımlandığı sırada bildirmiş olmasıyla aynıdır. Diğer bir deyişle, kısmi sınıfların içeriği, sınıfın tam tanımı noktasında yazılmış gibi değerlendirilir ve kısmi sınıfların içeriği yerinde yazılmış gibi, sınıfın tam tanımı noktasında ad arama ve diğer dil kuralları uygulanır

Aşağıdaki iki kod örneğinin anlamı ve etkisi aynıdır. İlk örnek kısmi bir sınıf kullanır ve ikinci örnek kullanmaz.

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);

};


Şablonlar

Kısmi sınıf şablon olamaz.

Kısıtlamalar

Kısmi sınıf tek bir çeviri biriminin ötesine yayılamaz.

Anahtar partial sözcük yalnızca anahtar sözcük veya value class anahtar sözcükle ref class birlikte desteklenir.

Örnekler

Aşağıdaki örnek, sınıfı iki Address kod dosyası arasında tanımlar. Tasarımcı değiştirir Address.details.h ve siz değiştirirsiniz Address.h. Yalnızca ilk dosyadaki sınıf tanımı anahtar sözcüğünü partial kullanır.

// 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(); }
};

Ayrıca bkz.

Tür Sistemi
C++/CX Dil Başvurusu
Ad Alanları Başvurusu