Miras alınmayan herhangi bir OO dili var mı?


22

Bugün bir kod incelemesi sırasında bir meslektaşım ilginç bir şey söyledi:

prototypemirasa ihtiyaç duyduğunuzda - ve miras ne zaman iyi bir fikirdir ?

Bunu düşündüm ve ilk başta, kötü bir şekilde tasarlanan kodu bulmak için genellikle miras kullandığımı fark ettim. Modern OO tarzı mirasa bağlı olarak kompozisyonu tercih ediyor, ancak bunu kalbe alan ve gerçekten uygulayan dilleri bilmiyorum .

Sınıf temelli mirasa izin vermeyen sınıf, nesne, yöntem, arayüz ve benzeri genel amaçlı programlama dilleri var mı? (Eğer böyle bir fikir mantıklı değilse, neden olmasın?)


7
Meslektaşın seni saptırdı. Ayrıca prototype, örnekler arasında paylaşılması gereken genel yöntem ve özelliklere sahip olduğunuzda da kullanışlıdır. Ayrıca instanceofişleci JavaScript'te doğru kullanmanıza izin verdiği için de kullanışlıdır if (foo instanceof Foo) { ....
Greg Burghardt,

2
Bence tür, hal ve davranış mirası arasında bir ayrım yapmalıyız. Kompozisyon tercihi Java topluluğunda çok yaygındır, ancak aynı zamanda, türlerin kalıtımı (ve hatta çok sayıda kalıtım) yaygın olarak kullanılır ve teşvik edilir ... ve implementsanahtar kelime ve arayüzler kullanılarak (devlet mirasının aksine) ve extendsanahtar kelimenin kullanımıyla ortaya konan davranış , herhangi bir uygulamayı içeren sınıflarda).
toniedzwiedz

6
Kompozisyonu tercih etmek, mirastan tamamen vazgeçmenin iyi bir fikir olduğu anlamına gelmez.
Caleb

5
Java'yı uygulama mirası olmadan görmek : "Google’ın gitmesi, OOP olurken uygulama mirasından kurtulan bir dilin örneğidir ..."
gnat

1
@GregBurghardt Aynısı, işlevleri içeren bir nesneyi döndüren bir fabrika işleviyle gerçekleştirilebilir (özel verileri kapatmaya depolamak). new, thisVe prototypetüm çok fazla IMO ortak kullanım için bir mayın tarlası vardır.
Benjamin Hodgson

Yanıtlar:


18

Nesne yönelimli programlama tanımı sorusunu bir kenara bırakarak soru, “yalnızca bileşimi kullanan ve miras için bir aracı olmayan diller var mı?” Den biri haline gelir.

Bunun cevabı oldukça basit bir şekilde "evet". Halen, klasik olarak düşündüğü gibi miras almanın bir yolu yoktur. Bir olabilir başka bir nesneye bir nesneyi gömülü ve bu nesneyi uzanır. Gönderen Nesne Desoriented Dili ( github ayna ):

type Person struct {
        Name string
}

func (p *Person) Intro() string {
        return p.Name
}

type Woman struct {
        Person
}

func (w *Woman) Intro() string {
        return "Mrs. " + w.Person.Intro()
}

Dize olan bir isme sahip bir kişi yapınız var. Adı döndüren Intro adında ortak bir fonksiyon vardır. Kadın yapısının, içine yerleştirilmiş olan payanda erişen Intro işlevi de vardır. Ve böylece mirasçılık niyetleri yalnızca kompozisyon kullanılarak yerine getirilebilir.

Daha fazlası GoLang Tutorials'da görülebilir: Go'da Kalıtım ve Alt Sınıflandırma - veya yakınlığı .

Yani evet, kalıtım olmadan bir OO diline sahip olmak mümkün, ve bir tane var.

İçinde bu, gömme olarak bilinir ve çevreleyen yapılara gömülü alanlara erişme yeteneği verir ve onları da sanki varmış gibi çalışır - ancak bu bir alt sınıf değildir. Tasarım felsefesi Go FAQ'da bulunabilir: Neden tür kalıtımı yoktur?


Bir de C typedefve kullanımı hakkında yorum yapabilir struct...
cwallenpoole

@cwallenpoole'da gerçekten benzer fikirler var, ancak C'yi nesne yönelimli bir dil olarak adlandırmakta tereddüt etmeme rağmen.

Bilmiyorum. Ekli işlevlere sahip nesneler yaratamayacağınız gerçeğini itiraf edeceğim, buna karşı işe yarıyor ama kalıtım olmadan, OOP lezzetini kaybediyor.
cwallenpoole

@cwallenpoole ile kalıtımın ne olduğunu ve nesne yönelimini tanımlamaya başladık. Ama bir sorun hakkında düşünme onun sadece farklı şekilde, olası. Mesele şu ki, kalıtım, çoğu C ++ ve Java programlayıcısının uzantıyı düşünme şeklidir ... ama başka modeller de var. Kalıtım olmadan uzatma: 1 , 2 , 3 iyi okumalardır.

"Nesne Desoriented Language" bağlantısı şu anda bir yönlendirme döngüsünde kalmış, ancak makaleyi burada buldum: github.com/nu7hatch/areyoufuckingcoding.me/blob/master/content/… . Teşekkürler!
Matt Browne

7

Sınıf temelli mirasa izin vermeyen sınıf, nesne, yöntem, arayüz ve benzeri genel amaçlı programlama dilleri var mı?

Bu, Microsoft Office ve diğer VBA özellikli ana bilgisayarlara (örneğin, AutoCAD, Sage 300 ERP, vb.) Ve hatta VB6'ya gömülü VBA - Visual Basic for Applications açıklaması gibi. "Temel" in "A" kısmı zaten "Çok Amaçlı" anlamına gelir, bu yüzden "genel amaçlı" kısım vardır.

VB6 / VBA'da sınıflar (ve dolayısıyla nesneler), yöntemler ve ISomethingarayüzler vardır; bunun gibi bir sınıf modülünde bir arayüz tanımlayabilirsiniz :

Option Explicit

Public Sub DoSomething()
End Sub

Ve sonra bunu yapan başka bir sınıfa sahip olun:

Option Explicit
Implements ISomething

Private Sub ISomething_DoSomething()
    'implementation here
End Sub

Hiçbir kamu üyesini açığa çıkaran böyle bir sınıfa ancak ISomethingarayüzü üzerinden erişilebildi - ve orada çok sayıda farklı uygulama olabilirdi ISomething, bu yüzden OOP VBA kodu polimorfizmi mükemmel bir şekilde yapabiliyor ve verilen bir sınıf için tamamen yasal. de çoklu arayüzleri uygulamak.

VB6 / VBA sınıf mirasına izin vermez , bu nedenle bir uygulamayı başka bir türden, ancak onun arayüzünden miras alamazsınız . Şimdi, bunun bir kaza, bir tasarım hatası, dahi bir vuruş veya çok çirkin bir gözetim olup olmadığı tartışmalara açık; VB6 / VBA'nın bunu kalbe alıp götürmediği belli değil , ama kesinlikle zorluyor .

Eğer Git sınıf mirası yapmak ve yine bir OOP dilidir gelmez VB6 / VBA bir OOP dili olarak kabul yanı alınmama nedenini, o zaman ben görmüyorum.</PreemptiveResponseToVBAHatersThatWillSayItIsNotAnOOPLanguage>


1
Adil olmak gerekirse, OP modern dilleri sordu . =;) -
RubberDuck

@RubberDuck #burn!
Mathieu Guindon

0

Derleyicinin özel / korumalı kullanımı ve "PImpl" veya "Özel Uygulama" tekniklerinin modern kullanımı yoluyla seçici mirası zorlamasını sağlayabilirsiniz.

Çoğu API yalnızca bir kullanıcının miras almasını isteyeceğiniz bileşenleri gösterir ve gerisini ayrı bir uygulama sınıfında gizler. Böylece, genel arayüzleri, mirasçı olmayan, yalnızca nesne kompozisyonu ile kullanılabilen ve derleyici tarafından uygulanan sınıfları yazabilirsiniz. Bu, derleyiciyi yazılımın amacını zorlamak için kullandığında genellikle iyi bir uygulamadır.

Javascript'teki özel üye işlevlerinin hızlı bir şekilde aranması benzer bir ilkenin olduğunu gösterir, ancak herkes kullanabiliyorsa kodunuzu görebilir: http://www.crockford.com/javascript/private.html

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.