Yanıtlar:
Tanım
Bir nesne, şu durumlarda birinci sınıftır:
- değişkenlerde ve veri yapılarında depolanabilir
- Bir alt yordam için bir parametre olarak geçirilebilir
- bir alt rutin sonucu iade edilebilir
- çalışma zamanında inşa edilebilir
- kendine özgü bir kimliği var (verilen addan bağımsız)
Burada "nesne" terimi, nesne yönelimli programlamadaki nesnelere atıfta bulunmak zorunda kalmadan, gevşek olarak kullanılır. Tam sayı ve kayan nokta sayıları gibi en basit skaler veri türleri neredeyse her zaman birinci sınıftır.
Bir programlama dilinde "birinci sınıf vatandaş" veya "birinci sınıf eleman" kavramı , 1960'larda birinci sınıf fonksiyonlar bağlamında İngiliz bilgisayar bilimcisi Christopher Strachey tarafından tanıtıldı . Bu ilkenin en meşhur formülasyonu muhtemelen Gerald Jay Sussman ve Harry Abelson'un Bilgisayar Programlarının Yapısı ve Yorumunda:
- Değişkenlere göre adlandırılmış olabilirler.
- Prosedürlere argüman olarak geçirilebilirler.
- Prosedürlerin sonucu olarak iade edilebilirler.
- Veri yapılarına dahil edilebilirler.
Temel olarak, bu programlama dili öğesinde, programlama dilindeki tüm diğer öğelerle yapabileceğiniz her şeyi yapabileceğiniz anlamına gelir.
Bunların hepsi “eşit haklar” ile ilgilidir: yukarıdakilerin hepsini, yani, tamsayılarla yapabilirsiniz, öyleyse neden başka bir şey farklı olsun?
Yukarıdaki tanım, programın nesneleri olmakla ilgili olarak yalnızca birinci sınıflığın yönünden gerçekten bahsetmesi anlamında biraz kısıtlayıcıdır. Daha genel bir tanım, bir şeyin birinci sınıf olduğunu, onunla her şeyi yapabilirseniz, benzer türden diğer şeylerle de yapabilirsiniz.
Örneğin, Java operatörleri ve Java yöntemleri benzerdir. Yeni yöntemleri tanımlayabilir, (biraz) kendi yöntemlerinin isimlerini özgürce seçebilir, yöntemleri geçersiz kılabilir, yöntemleri aşırı yükleyebilirsin. James Gosling bunların hepsini operatörlerle de yapabilir, ama sen ve ben yapamayız. Ben, yaygın inanışın aksine Yani, Java yapar destek operatörü aşırı yüklenmesini: örneğin, +
operatör için aşırı byte
, short
, int
, long
, float
, double
ve String
ayrıca için ve IIRC Java 7 BigInteger
ve BigDecimal
(ve muhtemelen unuttuğum bir çift), o sadece var seninüzerinde herhangi bir etkisi yoktur. Bu açıkça operatörleri bu ikinci tanıma göre ikinci sınıf yapar. Yine de, yöntemlerin birinci tanıma göre birinci sınıf nesneler olmadığını unutmayın. (Bu operatörleri üçüncü sınıf yapar mı?)
Genellikle bu parametre olarak geçirgen bir yapıyı ifade eder, bir fonksiyondan bir dönüş tipi olarak tanımlanabilir veya bir değere atanabilir. Normalde onları çalışma zamanında oluşturabilmeniz gerekir. Örneğin, bir sınıfın örneği c ++ veya java'da birinci sınıf bir vatandaş olacaktır, ancak C'deki bir işlev olmayacaktır.
Özelliğin yalnızca dil tarafından uygulanması halinde, birinci sınıf bir vatandaş olduğunu söyleyebilirim.
yani, bu özelliği uygulamak için çoklu dil özellikleri veya standart bir kütüphane gerektirmez.
Örnek:
C / C ++ 'da işlevleri birinci sınıf vatandaş olarak görmüyorum (diğerleri olabilir).
Bunun nedeni, doğrudan dilin desteklediği fındık işlevlerini manipüle etmenin yolları olduğu, ancak diğer dil özelliklerinin kullanılmasını gerektirmesidir. Parametreleri bir işleve bağlama doğrudan desteklenmez ve bu özelliği uygulamak için bir işlev oluşturmalısınız.
Daha önce verilen cevaplara bir örnek eklemek için:
WCF / C # 'da, şu anda bir servis olarak çalışması için bir servis sözleşmesi niteliğindeki bir sınıf nesnesini işaretlemeniz gerekir. Böyle bir şey yoktur:
public **service** MyService (in relation public **class** MyClass).
Bir sınıf, bir hizmetin olmadığı, c # dilinde birinci sınıf bir vatandaştır.
Bu yardımcı olur umarım