Bir özellik ne zaman bir programlama dilinde / platformunda “Birinci sınıf vatandaş” olarak kabul edilir?


61

"Lütfen bu özelliği çok dil / platformda birinci sınıf bir vatandaş yap" gibi ifadeler gördüm. Örneğin, net C # /. Peki, bir özellik ne zaman bir programlama dilinde / platformunda "Birinci sınıf vatandaş" olarak kabul edilir?

Yanıtlar:


40

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.

http://en.wikipedia.org/wiki/First_class_object


1
Peki, enums ikinci sınıf nesnesini .net / C # dizininde yapan nedir?
Gulshan

7
@ Gülhan - içsel kimliğin eksikliğini tartışabilirsin - C # enums bir temel değer için tam olarak sadece sözdizimsel şekerdir (yani bir "verilen isim"). Enums'lerin kendi başlarına nesneler olduğu Java ile karşılaştırın.
mikera

@mikera, .NET numaralarında kendi başlarına değerleridir. Java sadece herhangi bir değere sahip değil, sadece nesnelere sahip, tek fark bu.
SK-mantığı

@mikera: Java'nın numaralandırmalarını, bit alanlarını onlarla temsil edebilmek gibi bazı güzel özelliklere sahip olmamakla birlikte. Uygulamaları muhtemelen daha birinci sınıf olmasına rağmen, API'lerinin çoğu hala birçok tamsayı (ya da string) sabitine sahiptir ve bunların birçok kullanımı kolayca enum'lerle değiştirilemez.
Joey

Enum'un çalışma zamanında .NET'te yapılabileceğini sanmıyorum. Her zaman sabit olduklarını düşündüm.
travis

33

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, doubleve Stringayrıca için ve IIRC Java 7 BigIntegerve 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ı?)


6

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.


Bir sınıfı c ++ 'da birinci sınıf vatandaş yapan nedir?
Bjarke Freund-Hansen

2
@bjarkef: Önceki cümlelerde sunulan açıklamaları eşleştirerek yanıtlanmış gibi görünüyor.
doppelgreener

@Jonathan: Evet, özür dilerim, "bunları çalışma zamanında inşa et" i yanlış anladım. Evet, çalışma zamanında (nesne) bir sınıf örneği oluşturabilir, ancak sınıfın kendisini oluşturamazsınız. Kafamı karıştıran bu.
Bjarke Freund-Hansen

1
Parametre ile geçmek hala yeterli değil. C / C ++ 'da hala işlevleri ikinci sınıf vatandaş olarak görecektim. Diğer nesnelerin içine yerleştirilen sonuç olarak döndürülen parametreler olarak iletilebilirler. Ancak diğer yapıların yardımı olmadan manipüle edilemezler (parametreleri bir fonksiyona bağlamak için std :: bind gereklidir).
Martin York

@ Martinin, fonksiyonların C / C ++ 'da birinci sınıf vatandaş olduğunu söylemedim.
Pemdas

1

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


1
Fonksiyonların kendileri ise bağlı işlevleri (veya "kapanışları") birinci sınıf yapmazlar mıydı? 0x'in kapanışları desteklemesi analizinize nasıl katılıyor?
Fred Nurk

@ Fred Nurk: Her şey dile bağlı. Bazı dillerde kapaklar birinci sınıf sistemlerdir. Diğerlerinde değil. Henüz açık bir yorum yapmak için henüz C ++ 0x ile aşina değilim.
Martin York

Diyelim ki, dil cevap sizin gibi C veya C ++ (ama 0x değil). "Birinci sınıf" tanımınız, fonksiyonların kendileri iken birinci sınıf olmayacağına bağlı işlevler (veya "kapanışlar") yapmaz mıydı?
Fred Nurk

@Fred Nurk: Eğer bir fonksiyonla yapabileceğiniz tek şeyi sınırlarsanız, onları kapatmanız gerekir, o zaman emin olun. Ama bana göre bu, platformun sadece bir kütüphane ithal ederek tamsayıların eklenmesini destekleyip desteklemediğini söylemek gibidir. O zaman tamsayılar birinci sınıf vatandaşlardır ancak tamsayıların eklenmesi göz önünde bulundurulmaz. Benim görüşüme göre kapatma, yeni bir işlevi etkin bir şekilde döndüren bir işlev üzerinde gerçekleştirilebilecek bir işlemdir (ancak onu nasıl tanımladığınıza bağlıdır). Ancak kapanma ve bağlayıcılık, sadece iki operasyondan başkalarının tartışmanın dışında kalacağımızdır (bunun bir soru olduğundan emin değilim).
Martin York

@ Martin: Kendimi net bir şekilde açıklamamalıyım. "Bir özellik yalnızca dil tarafından uygulanıyorsa birinci sınıf vatandaşdır" ifadesi göz önüne alındığında, hem C hem de C ++ 'daki işlevler yalnızca dil tarafından uygulanır ve bu nedenle birinci sınıf olur. Bağlantılı işlevler ("kapanışlar" olarak da bilinir) bağlayıcı parametrelerle vb. Bahsettiğiniz şeydir, ancak bu farklı bir özelliktir.
Fred Nurk

-1

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.