Nesne tipi (nesne yönelimli programlama) - Object type (object-oriented programming)
Gelen bilgisayar bilimleri , bir nesne türü (aka sarma nesnesi ) bir olduğu veri türü kullanılır nesne yönelimli programlama için sarmak bir süsü olmayan bir nesne türü dinamik nesne .
Bazı nesne yönelimli programlama dilleri , çalışma zamanı verimliliği ve sözdizimi veya anlamsal sorunlar gibi nedenlerle, karmaşık değer türlerinin bulunmadığı platformlarda genellikle nesneler ve nesne olmayanlar olarak adlandırılan başvuru ve değer türleri arasında bir ayrım yapar . Örneğin, Java'nın her ilkel türe karşılık gelen ilkel sarmalayıcı sınıfları vardır : ve , ve , ve vb. C++ gibi dillerde çok az başvuru türü kavramı vardır veya hiç yoktur ; bu nedenle, nesne türünün kullanımı çok az ilgi çekicidir.
IntegerintCharactercharFloatfloat
Boks
Paketleme olarak da bilinen kutulama, ilkel bir referans nesnesi olarak kullanılabilmesi için bir nesnenin içine ilkel bir tür yerleştirme işlemidir. Örneğin, Java'da a LinkedListboyutunu değiştirebilir, ancak bir dizinin sabit bir boyutu olmalıdır. Bir LinkedListof değerine sahip olmak istenebilir int, ancak LinkedListsınıf yalnızca dinamik nesnelere yapılan başvuruları listeler; değer türleri olan ilkel türleri listeleyemez.
Bunu aşmak için , dinamik nesneler olan intiçine kutulanabilir Integerve ardından bir LinkedListof öğesine eklenebilir Integer. ( J2SE 5.0'da tanıtılan genel parametreli türler kullanılarak , bu tür olarak temsil edilir .) Öte yandan, C# hiçbir ilkel sarmalayıcı sınıfına sahip değildir, ancak genel bir başvuru döndürerek herhangi bir değer türünün kutulanmasına izin verir . Gelen amaç-C , bir temel değer bir ile başlayan edilebilir bir hale getirmek için ona (örneğin üzerinden ya da ). Bu, onları standart koleksiyonlardan herhangi birine, örneğin bir .
LinkedList<Integer>Object@NSNumber@123@(123)NSArray
Kutulu nesne her zaman değer nesnesinin bir kopyasıdır ve genellikle değişmezdir . Nesnenin kutusundan çıkarılması, depolanan değerin bir kopyasını da döndürür. Nesnelerin tekrar tekrar kutulanması ve kutudan çıkarılması , performans üzerinde ciddi bir etkiye sahip olabilir, çünkü kutulama yeni nesneleri dinamik olarak tahsis eder ve kutudan çıkarma (kutulu değer artık kullanılmıyorsa) onları çöp toplama için uygun hale getirir . Ancak, varsayılan Java HotSpot çöp toplayıcı gibi modern çöp toplayıcılar kısa ömürlü nesneleri daha verimli bir şekilde toplayabilir, bu nedenle kutulu nesneler kısa ömürlüyse performans etkisi o kadar kötü olmayabilir.
Bazı dillerde, kutusuz bir ilkel tür ile değişmez, kutulu bir nesne türüne yapılan başvuru arasında doğrudan bir denklik vardır. Aslında, bir programdaki tüm ilkel türleri kutulu nesne türleri ile değiştirmek mümkündür. Bir ilkelden diğerine atama değerini kopyalarken, bir referanstan kutulu bir nesneye atama, ilk referansla aynı nesneye atıfta bulunmak için referans değerini kopyalayacaktır. Bununla birlikte, bu herhangi bir soruna neden olmaz, çünkü nesneler değişmezdir, bu nedenle aynı nesneye veya farklı nesnelere yapılan iki referans arasında anlamsal olarak gerçek bir fark yoktur (fiziksel eşitliğe bakmadığınız sürece). Aritmetik, karşılaştırma ve mantıksal işleçler gibi atama dışındaki tüm işlemler için, kutulu türün kutusu kaldırılabilir, işlem gerçekleştirilebilir ve gerektiğinde sonucu yeniden kutulayabilirsiniz. Böylece, ilkel türleri hiç saklamamak mümkündür.
otomatik kutulama
Otomatik kutulama, yalnızca tür dönüştürme (örtük veya açık) yoluyla bir değer türünden bir referans türü elde etme terimidir . Derleyici, nesneyi oluşturan ekstra kaynak kodunu otomatik olarak sağlar.
Örneğin, J2SE 5.0'dan önceki Java sürümlerinde aşağıdaki kod derlenmedi:
Integer i = new Integer(9);
Integer i = 9; // error in versions prior to 5.0!
5.0'dan önceki derleyiciler son satırı kabul etmez. Integeryüzey üzerinde bir referans amaçları, farksız List, Objectve benzeri. a'dan a'ya dönüştürmek intiçin Integer, Integer nesnesini "el ile" başlatmak gerekiyordu. J2SE 5.0'dan itibaren, derleyici son satırı kabul edecek ve değeri depolamak için bir Integer nesnesi oluşturulacak şekilde otomatik olarak dönüştürecektir 9. , J2SE 5,0 gibi bir şey, üzerindeki bu araçlar , nerede ve olan kendilerini, şimdi derlemek olacak - a ve b, özetlenebilir tamsayı değerleri kutusuz, ve sonucun yeni haline autoboxed edilir nihayet değişkeni içinde depolanan . Eşitlik operatörleri bu şekilde kullanılamaz, çünkü eşitlik operatörleri referans türleri için, referansların eşitliği için zaten tanımlanmıştır; kutulu bir türde değerin eşitliğini test etmek için, yine de bunları manuel olarak kutudan çıkarmalı ve ilkelleri karşılaştırmalı veya yöntemi kullanmalısınız .
Integer c = a + babIntegerIntegercObjects.equals
Başka bir örnek: J2SE 5.0, programcının bir koleksiyonu (a gibi LinkedList) nesneler intyerine değerler içeriyormuş gibi ele almasına izin verir Integer. Bu, yukarıda söylenenlerle çelişmez: koleksiyon hala yalnızca dinamik nesnelere referanslar içerir ve ilkel türleri listeleyemez. a olamaz , ancak bunun yerine olmalıdır . Bununla birlikte, derleyici kodu otomatik olarak dönüştürür, böylece liste "sessizce" nesneleri alır, kaynak kodu ise yalnızca ilkel değerlerden bahseder. Örneğin, programcı artık listeye eklenmiş gibi yazabilir ve düşünebilir ; ancak, derleyici satırı fiilen .
LinkedList<int>LinkedList<Integer>list.add(3)int 3list.add(new Integer(3))
kutudan çıkarma
Kutudan çıkarma, belirli bir nesneyle ilişkilendirilen değeri, yalnızca tür dönüştürme (örtük veya açık) yoluyla elde etmek anlamına gelir. Derleyici, ya o nesne üzerinde bir yöntem çağırarak ya da başka yollarla o nesneden değeri alan ekstra kaynak kodunu otomatik olarak sağlar.
Örneğin, J2SE 5.0'dan önceki Java sürümlerinde aşağıdaki kod derlenmedi:
Integer k = new Integer(4);
int l = k.intValue(); // always okay
int m = k; // would have been an error, but okay now
C#, ayrı bir ilkel türler ve nesne türleri kümesine sahip olmadığı için Java ile aynı anlamda otomatik kutudan çıkarmayı desteklemez. Java'da hem ilkel hem de nesne sürümüne sahip tüm türler, C# derleyicisi tarafından ya ilkel (değer) türler ya da nesne (başvuru) türleri olarak otomatik olarak uygulanır.
Her iki dilde de otomatik kutulama otomatik olarak downcast olmaz, yani aşağıdaki kod derlenmez:
C#:
int i = 42;
object o = i; // box
int j = o; // unbox (error)
Console.WriteLine(j); // unreachable line, author might have expected output "42"
Java:
int i = 42;
Object o = i; // box
int j = o; // unbox (error)
System.out.println(j); // unreachable line, author might have expected output "42"
yardımcıları yazın
Modern Object Pascal , yakın boks, basit türleri üzerinde de denilen tip yardımcıları işlemleri gerçekleştirmek için bir başka yol daha vardır FreePascal veya kayıt yardımcıları Delphi ve FreePascal Delphi modunda.
Bahsedilen lehçeler, Object Pascal'ın yerel dillere derlemesidir ve bu nedenle C# ve Java'nın uygulayabileceği bazı özellikleri kaçırır. Kesin olarak yazılan değişkenler üzerinde özellikle çalışma zamanı türü çıkarımı .
Ancak özellik boksla ilgilidir.
Programcının aşağıdaki gibi yapıları kullanmasına izin verir.
{$ifdef fpc}{$mode delphi}{$endif}
uses sysutils; // this unit contains wraps for the simple types
var
x:integer=100;
s:string;
begin
s:= x.ToString;
writeln(s);
end.