Aracılığıyla paylaş


Değer Türlerini Dolaylı Olarak Kutulama

Değer türlerinin kutulaması, C++'deki Yönetilen Uzantılar'dan Visual C++ 2010'a değişmiştir.

Dil tasarımında özellik ile pratik deneyimi yerine felsefi bir konum uyguladık ve pratikte bu bir hataydı. Benzetme yapmak gerekirse, özgün çoklu devralma dil tasarımında, Stroustrup sanal temel sınıf alt nesnenin türetilmiş bir sınıf kurucusu içinde başlatılabileceğine karar verdi ve dolayısıyla da dil sanal taban sınıf olarak hizmet veren herhangi bir sınıfın varsayılan bir Oluşturucu tanımlamasını gerektirdi. Herhangi sonradan gelen bir sanal türetme tarafından çağrılan varsayılan oluşturucudur.

Sanal temel sınıf hiyerarşisinin sorunu, paylaşılan sanal alt nesnelerin başlatılmasına ilişkin sorumluluğun her izleyen türetmeyle kaymasıdır. Örneğin, başlatma işleminin bir arabellek atanmasını gerektirdiği bir taban sınıfı olduğunda, söz konusu arabelleğin kullanıcıya özel boyutu, oluşturucuya bir bağımsız değişken olarak geçebilir. Sonra, I iki izleyen sanal türetme sağlarsa, onları inputb ve outputb olarak arayın, her biri temel sınıf oluşturucusu için belirli bir değer sağlar. Bu durumda, hem inputb hem de outputb öğesinden bir in_out sınıfı elde ettiğimde, paylaşılan sanal temel sınıf alt nesnesinin bu değerlerinden hiçbiri makul bir şekilde değerlendirilemez.

Bu yüzden, özgün dil tasarımı içinde, Stroustrup türetilen sınıf oluşturucusunun temel başlatma listesi dahilinde bir sanal temel sınıfın açık başlatmasına izin vermedi. Bu sorunu çözmüş olsa da, pratikte sanal taban sınıfının doğrudan başlatılmasının mümkün olmadığı kanıtlandı. Ulusal Sağlık Enstitüsü'nden,nihcl adındaki SmallTalk koleksiyonu kitaplığının bir ücretsiz sürümünü uygulayan Keith Gorlen, Stroustrup'ı daha esnek bir dil tasarımı yarattığı konusunda ikna etmede önde gelen kişilerdendi.

Nesne Yönelimli hiyerarşik tasarım prensibi, türetilmiş bir sınıfın kendisini yalnızca anlık temel sınıflarının özel olmayan uygulamasıyla ilişkilendirmesi gerektiğini ortaya koyar. Sanal devralma için esnek başlatma tasarımını desteklemek için Stroustrup bu ilkeyi ihlal etmek zorunda kaldı. Bir hiyerarşide en türetilmiş sınıf, hiyerarşinin ne kadar derininde olduğuna bakılmaksızın tüm sanal alt nesne başlatmaları için sorumluluğu üstlenir. Örneğin, inputb ve outputb anlık anal taban sınıflarını açık olarak başlatmaktan sorumludur. in_out öğesi hem inputb hem de outputb öğelerinden türetildiğinde in_out öğesi daha önce kaldırılmış olan sanal temel sınıfının başlatılmasından sorumlu olur, inputb içindeki başlatma açık bir şekilde yapılır ve outputb bastırılır.

Bu dil geliştiricilerin istediği esnekliği sağlar, fakat aynı zamanda karmaşık anlambilimi de getirir. Bir sanal temel sınıf durum olmaksızın yasaklanırsa ve sadece bir arabirim belirlemek için buna izin verilirse, bu karmaşa yığınından sıyrılınır. Bu, C++ içindeki önerilen bir tasarım deyimidir. CLR programlamada Arabirim türü ile ilkeye yükseltildi.

Basit bir kod örneği aşağıdadır ve bu durumda açık paketleme gereksizdir:

// Managed Extensions for C++ requires explicit __box operation
int my1DIntArray __gc[] = { 1, 2, 3, 4, 5 };
Object* myObjArray __gc[] = { 
   __box(26), __box(27), __box(28), __box(29), __box(30)
};

Console::WriteLine( "{0}\t{1}\t{2}", __box(0),
   __box(my1DIntArray->GetLowerBound(0)),
   __box(my1DIntArray->GetUpperBound(0)) );

Gördüğünüz gibi, birçok paketleme devam ediyor. Visual C++ 2010 altındaki değer türü kutulaması dolaylıdır:

// new syntax makes boxing implicit
array<int>^ my1DIntArray = {1,2,3,4,5};
array<Object^>^ myObjArray = {26,27,28,29,30};

Console::WriteLine( "{0}\t{1}\t{2}", 0, 
   my1DIntArray->GetLowerBound( 0 ), 
   my1DIntArray->GetUpperBound( 0 ) );

Ayrıca bkz.

Başvuru

Implicit Boxing

Kavramlar

Değer Türleri ve Davranışları