tl; dr: OO olmadan kalıtım olabilir, OO olmadan kapsülleme yapabilirsiniz, OO olmadan polimorfizme sahip olabilirsiniz, OO'suz üç kerede bile olabilirsiniz. Flipside, kalıtım olmadan OO'ya sahip olabilirsiniz. Ayrıca, farklı kapsülleme türleri (ADT odaklı ve OO) vardır, IOW tüm kapsülleme OO değildir.
Uzun versiyon:
"Nesneye Yönelik Programlama" terimi Alan Kay tarafından icat edildi, bu yüzden ne anlama geldiğine karar verdi. Ve bunu şu şekilde tanımlar :
OOP bana sadece mesajlaşma, yerel tutma ve devlet sürecinin korunması ve gizlenmesi ve her şeyin aşırı geç bağlanması anlamına geliyor.
Uygulama açısından, mesajlaşma geç bağlı bir prosedür çağrısıdır ve prosedür çağrıları geç bağlıysa, tasarım zamanında ne arayacağınızı bilemezsiniz , bu nedenle devletin somut temsili hakkında herhangi bir varsayım yapamazsınız. Yani, gerçekten mesajlaşma ile ilgili, geç bağlama mesajlaşma uygulamasıdır ve kapsülleme bunun bir sonucudur.
Daha sonra " Büyük fikir" mesajlaşma " olduğunu açıkladı ve" mesaj yönelimli "yerine" nesne yönelimli "olarak adlandırdığı için pişmanlık duydu, çünkü" nesne yönelimli "terimi önemsiz şeye odaklanıyor (nesneler) ) ve gerçekten önemli olandan (mesajlaşma) dikkat dağıtır:
Smalltalk'un sadece sözdizimi ya da sınıf kütüphanesi olmadığını, hatta sınıflarla ilgili olmadığını herkese hatırlatmak için son OOPSLA'da bazı acıları aldığımı nazik bir hatırlatma. Uzun zaman önce bu konu için "nesneler" terimini bulduğum için özür dilerim, çünkü birçok insan daha az fikre odaklanıyor.
Büyük fikir "mesajlaşma" - Smalltalk / Squeak çekirdeği bununla ilgilidir (ve bu Xerox PARC aşamasında asla tam olarak tamamlanmamış bir şeydir). Japonların küçük bir sözcüğü vardır - ma - "arasında" olan - belki de en yakın İngilizce karşılığı "geçiş reklamı" dır. Büyük ve büyütülebilir sistemler üretmenin anahtarı, modüllerinin iç özelliklerinin ve davranışlarının olması gerekenden ziyade nasıl iletişim kurduğunu tasarlamaktır. İnterneti düşünün - yaşamak için, (a) herhangi bir standardın ötesinde birçok farklı türde fikir ve gerçekleştirmeye izin vermek ve (b) bu fikirler arasında değişen derecelerde güvenli birlikte çalışabilirliğe izin vermek zorundadır.
(Elbette, bugün çoğu insan nesnelere değil, daha da yanlış olan sınıflara odaklanıyor.)
Mesajlaşma , hem metafor hem de bir mekanizma olarak OO için esastır .
Birisine mesaj gönderirseniz, onunla ne yaptığını bilmezsiniz. Gözleyebileceğiniz tek şey onların cevabıdır. İletiyi kendileri işleyip işlemediklerini (yani nesnenin bir yöntemi varsa), iletiyi başka bir kişiye (temsilci / proxy) iletmişlerse, anladılarsa bile bilmezsiniz. Enkapsülasyonun hepsi bu, OO tamamen bununla ilgili. Proxy'yi gerçekte beklediğiniz gibi yanıtladığı sürece gerçek şeyden ayıramazsınız.
"Mesajlaşma" için daha "modern" bir terim, "dinamik yöntem dağıtımı" veya "sanal yöntem çağrısı" dır, ancak bu metaforu kaybeder ve mekanizmaya odaklanır.
Benzer noktalar William R. Cook tarafından tekrar gözden geçirilen Veri Soyutlamasını Anlama ve ayrıca "Nesne" ve "Nesneye Yönelik" Modern Tanımlar Önerisinde de yer almaktadır .
İşlemlerin dinamik olarak gönderilmesi, nesnelerin temel özelliğidir. Bu, çağrılacak işlemin nesnenin dinamik bir özelliği olduğu anlamına gelir. İşlemler statik olarak tanımlanamaz ve genel olarak, belirli bir isteğe yanıt olarak hangi işlemin çalıştırılacağı dışında, çalıştırılması dışında hiçbir yol yoktur. Bu, her zaman dinamik olarak gönderilen birinci sınıf işlevlerle tamamen aynıdır.
Smalltalk-72'de herhangi bir nesne bile yoktu! Yalnızca ayrıştırılan, yeniden yazılan ve yeniden yönlendirilen mesaj akışları vardı . İlk önce yöntemler geldi (mesaj akışlarını ayrıştırmak ve yeniden yönlendirmek için standart yollar), daha sonra nesneler geldi (bazı özel durumları paylaşan yöntem grupları). Miras çok sonra geldi ve sınıflar sadece mirası desteklemenin bir yolu olarak tanıtıldı. Kay'ın araştırma grubu prototipleri zaten biliyor olsaydı, muhtemelen ilk etapta hiç ders vermezlerdi.
Her programcı , Tekrar gözden geçirilmiş Veri Soyutlamasını Anlama konusunu okumalıdır . Nesneler ve Soyut Veri Türleri arasındaki farkın ne olduğunu tam olarak açıklar. Java kullanarak örnekler verir ve bu soru ile son derece ilgilidir, çünkü hem ADT örneklerinde hem de Object örneklerinde kalıtım, kapsülleme ve polimorfizm kullanır, ancak örneklerden yalnızca biri nesne yönelimlidir! Başka bir deyişle: kalıtım, kapsülleme ve polimorfizm olabilir, hatta üçüne birden sahip olabilirsiniz ve yine de OO'nuz olmayabilir.
Öte yandan, kalıtım olmadan OO'ya sahip olabilirsiniz. Yukarıda ima ettiğim gibi: Smalltalk'ın ("Nesneye Dayalı Programlama" teriminin mucidi Alan Kay tarafından tasarlanan dil) mirasına sahip değildi.
Kesinlikle Son fakat en az değil, Orlando Antlaşması tartışır heyeti miras alternatif ve farklı nesne oiented dillerin tasarım alanı içinde farklı tasarım noktalarına heyet ve miras kurşun formları olarak. (Aslında, Java gibi kalıtımı destekleyen dillerde bile, insanlara bundan kaçınmayı öğrettiklerini ve yine OO için gerekli olmadığını gösterdiklerini unutmayın.)