Sınıf temelli olmayan nesne yönelimli programlama dilleri var mı?


44

Herhangi var nesne yönelimli programlama dilleri sınıf paradigma dayalı olmayan?


1
Teknik olarak konuşursak, C. Yönelimli olmasına rağmen dili kolaylaştıran bir gerginliktir. Bunun aradığınız cevap olmadığını biliyorum, ancak C'nin nasıl yapabildiğini incelemek istersen, sınıfların gerçekte ne yaptıkları ve alternatif yaklaşımların nasıl işleyebileceği hakkında bir fikir verebilir.
kylben

4
@kylben: "Oriented" çağrılmayan bir gerilmedir. C'yi nesne yönelimli davranışlara göre bludgeon yapabilirsiniz. Bu şekilde yönlendirilmeye karar veremezsin.
David Thornley

Yanıtlar:


74

Bildiğim kadarıyla, Self prototiplere dayalı “sınıfsız” paradigmayı icat eden orijinal dildir . 1980'lerde zaten (deneysel bir aşamada) mevcuttu ve Smalltalk'in prototip modelinin zarif kullanımını aşırı derecede zorlar , böylece sınıflar tamamen elimine edilir.

Bildiğim diğer tüm "sınıfsız" OO dillerini etkiledi:

  • en belirgin Javascript,
  • Klasik programlama dili ve çevre Squeak (Smalltalk üzerine inşa edilmiştir)
  • Çok paradigma senaryo dili Lua .

2
@Adam: statik yazmadan, TÜM sadece sözdizimsel şeker değil mi?
kevin cline '20:

5
@DeadMG OO dili, OO fikirlerini uygulamanıza izin veren değil, sizin için yapan bir
dildir

4
Aslında, hem Simula (1960) hem de Smalltalk-71'in (ve Smalltalk-72'nin yanı sıra) her ikisi de, Öz'de neredeyse otuz yıl öncesinden önce sınıflara sahip değildi. Sınıflar sadece Simula-67 ve Smalltalk-74'e eklendi (ve Alan Kay onları bir hata veya daha kesin olarak gerekli bir kötülük olarak gördü).
Jörg W Mittag

2
@kevincline: Neye dayandığına emin değilim; OO ve statik yazım tamamen dikeydir.
Paul Biggar

2
Simula dışında (sınıf paradigmasını ele geçirdi) Lezzetler, 1979'da MIT'de tanıtıldı ve her ikisi de Öz'ü öne süren CLOS'un öncülüydü.
Matthew Flynn

32

JavaScript gibi diller , davranışın mevcut nesneleri klonlayarak yeniden kullanıldığı prototiplere dayanır . Bağlandığım Wikipedia makalesi Lua, ActionScript ve diğer bazı dillerin bu paradigmayı takip ettiğini gösteriyor.


2
Herhangi bir ECMAScript değişkeni prototip paradigmasını kullanır.
zzzzBov

Neredeyse tüm değişkenler. ActionScript (Flash dili) sınıfları kullanır, ancak temel VM bunları prototip olarak uyguluyor olabilir.
mjfgates

@mjfgates, Actionscript 2, ECMAScript'e dayanıyordu ve Javascript'e çok benziyordu. Actionscript 3 bundan uzaklaşıyor, ancak dinamik yapısını hala koruyor. Herhangi bir değişkeni güçlü / zayıf olarak yazabilirsiniz çünkü özünde her şey bir nesnedir.
J_A_X

13

Dünyadaki en popüler nesne yönelimli programlama dili sınıflara sahip değil, Javascript olarak adlandırılıyor ve prototip tabanlı: http://en.wikipedia.org/wiki/Prototype-based_programming


11
"Dünyanın en popüler nesne yönelimli programlama dili"? Bu iddiadan hiç emin değilim.
Thomas Owens

8
@ThomasOwens, web’e dahil edilmesinden dolayı, web etkin olan her modern platformun (mobil cihazlar dahil) bir JavaScript tercümanı içerdiğini kolayca söyleyebilirsiniz. Bu, şu anda var olan en popüler prototip tabanlı dil olduğu için çok güçlü bir durum. ("SELF" için benzer bir tartışma yapabileceğinizi düşünmüyorsanız)
riwalk

1
Javascript, kesinlikle dünyadaki en yaygın kullanılan programlama dillerinden biridir, ancak çoğu kullanımın, belki biraz en-boyuna yönelik programlama (geri aramalar? AJAX? Olay işleyicileri?) İle birlikte, eski, zorunlu ya da işlemsel olmalarını beklerdim. ve böylece, javascript'i 'en popüler OOP dili' olarak adlandırmak pek haklı değildir.
tdammers

9
Ayrıca popülerliğinin esası üzerine bir tartışmaya son vermek için "her yerde" diyebilirim.
Anthony Pegram

3
@ Stargazer712: Dil biti olmaktan hoşlanmıyorum, ancak “dünyadaki en popüler nesne yönelimli programlama dilinin [ed: Javascript] 'in sınıfları olmadığını” iddia ediyor. İki istemden ayrılabilir: "Javascript en popüler nesne yönelimli programlama dilidir" ve "Javascript sınıflara sahip değil"; İkisini de katılıyorum.
Lie Ryan

6

Nesne yönlendirme, sadece kısmen birbirine bağlı olan birkaç önemli kavram için kullanılan bir terimdir. Örneğin, kalıtım, sınıflar yerine örnekler arasında durum bazında duruma göre ilan edilebilir veya prototypeThomas'ın yazdığı gibi bütün sınıf somut bir nesneyle temsil edilebilir . Yapı tanımını örnek oluşturma işleminden ayırmak daha normaldir. Benzer şekilde, geç bağlanma, nominal olarak aynı yönteme sahip nesnelerin çağrıldığında mutlaka aynı şeyi yapmaması ve kararın çalışma zamanında verilmesi anlamına gelir. Prototip tabanlı yaklaşımla da aynı şekilde mümkün. Ve kapsülleme, nesnelerinizin ilan edilmiş sınıfların örnekleri olup olmamasından temel olarak tamamen bağımsızdır.

Bununla birlikte, çoğu OO dili sıkıca sınıf kampındadır. Fakat o zaman bile çizgiyi bulanıklaştıran deyimler vardır: etki alanı odaklı tasarım genellikle belirli nesnelerin kimliğinin statik sınıf diyagramından çok daha önemli olduğu sistemlere yol açar ve dekoratörler aynı sınıf veya arayüzdeki nesnelerin çok daha fazla olmasını sağlar farklı davranış


6

Kale , sınıf yerine özelliklere dayanan nesne yönelimli bir dildir. Fark, esas olarak uygulama kompozisyonundadır. Bir nesnenin davranışı (yöntem tanımları), program metninde belirli bir noktada bildirimlerle belirlenir. Yani bu anlamda sınıf tabanlı sistemlere benzer.

Tamamen nesneye dayalı olan nesne hesabı (Cardelli'ye göre, sanırım) var. Her yöntem bir örnek üyesidir. Mevcut bir nesnenin içeriğini alarak ve bazı üyelerini ekleyerek, çıkararak veya değiştirerek yeni nesneler oluşturursunuz. Prototiplerden biraz farklı, çünkü yeni nesnenin eski nesneye bağlantısı yok, sadece içeriğinin bir kısmı var.

IIRC, Python ve diğer hashtable-diline dilleri kullanarak benzer şekilde programlamak mümkündür: örnek üye olarak bir işlev ekleyebilir ve ardından bir yöntem olarak çağırabilirsiniz.


5

Ada, 1995 revizyonundan itibaren, nesne yönelimlidir, ancak birçok OO dilin aksine nesne yönelimli türleri ve modülleri "sınıf" olarak adlandırılan tek bir yapı halinde birleştirmez. Bir türü "sınıf Foo" olarak bildirmek ve tüm ilişkili yöntem bildirimlerini sınıf bildirgesine koymak yerine, bir paketi bildirir ve türünü (a record) olarak ve paket içindeki diğer şeyleri bildirirsiniz. Sözü edilen diğer dillerden bazıları "sınıfsız" değildir, işleri organize etmenin sadece biraz farklı bir yoludur.

Ada 95'in nesneye yönelik özellikleri dilin mevcut 1983 versiyonuna eklenmiş; miras ve diğerlerini desteklemek için mevcut kayıt ve paket yapılarını genişletti.


Hatırladığım şey buydu, ayrıca rekorunu her üye işleve
Nikko

@Nikko: Nesneye yönelik her dilde ve arkasında açıkça Python ve CLOS'ta (ortak lisp) sahne arkasında olan şey budur.
Marcin

5

Io , başka bir prototip tabanlı nesne yönelimli dildir. Aslında diğer cevaplarda daha önce belirtilen dillerden ilham alıyor.

Io dinamik bir prototip tabanlı programlama dilidir. Io'daki fikirler çoğunlukla Smalltalk (tüm değerler nesnelerdir), Self (prototip tabanlı), NewtonScript (diferansiyel kalıtım), Act1 (eşzamanlılık için aktörler ve gelecekler), Lisp'ten (kod bir çalışma zamanı denetlenebilir / değiştirilebilir ağaçtır) ve Lua (küçük, gömülebilir).


4

Erlang. Ve evet, Erlang , OO tanımının üç noktasını da yerine getirdiği için nesne yönelimli bir dildir.

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.