Scala'da başka hiçbir türün alt türü nasıl değildir


19

Martin Odersky'nin scala ile fonksiyonel programlama üzerine kursu alıyorum ve şimdilik birlikte anlamlı olmayan iki şey öğrendim:

  1. Scala birden fazla mirası desteklemiyor
  2. Nothing diğer tüm türlerin bir alt türüdür

Bu iki ifade birlikte yaşayamaz, peki bu tam olarak nasıl yapılır? ve "diğer her türün alt tipi" nin anlamı nedir?

Düzenle 1

In Scala API , Nothingolarak tanımlanır abstract final class Nothing extends Any... yani nasıl diğer sınıfları uzatabilirsiniz?


Bu sayfa biraz yardımcı olabilir: artima.com/pins1ed/scalas-hierarchy.html
jhewlett

Görebildiğim kadarıyla "son özellik Hiçbir şey Herhangi Birini
Den

8
Türleri ve sınıfları karıştırıyorsunuz. Bu ikisi çok farklı şeyler. Ne yazık ki, bu ayrım ile karıştırılan tek kişi siz değilsiniz ve gerçekten ne yazık ki, karıştırılanların bazıları Java, C # ve C ++ gibi popüler dillerin tasarımcıları oluyor. Bunun Nothingher sınıfın bir alt sınıfı olduğunu söylemiyor . Diğer türlerin bir alt türü olduğunu söylüyor .
Jörg W Mittag

1
@delnan: Java'nın arayüzleri doğrudan Smalltalk protokollerinden alınır. Smalltalk'ta yalnızca protokoller türlerdir, sınıflar değildir. Java da, her iki arabirimleri ve sınıflar türleridir. Bu yanlış. Sınıflar tip değildir, sadece arabirimlerdir. Tüm bu dillerin sınıf değil, tür olan şeyleri olması önemsizdir. Sorun şu ki, bu dillerde sınıflar yanlış türlerdir.
Jörg W Mittag

1
@ JörgWMittag Bu farklı bir ifade ve son derece tartışmalı (zararlı olduğuna katılıyorum, ancak bunu yazımın yanlış anlaşılmasına atfetmeyeceğim). Burada tartışmanın bir anlamı yok.

Yanıtlar:


27

Alt tipleme ve miras iki farklı şeydir! Nothinggelmez uzatmak herşeyi, şey alt tip , sadece uzanır Any.

Belirleme [§3.5.2] alt kopyalanması-ilişkiyi düzenleyen özel bir durum vardır Nothing:

§3.5.2 Uygunluk

  • [...]
  • Her değer türü için
    T,scala.Nothing <: T <:scala.Any
  • Her tip yapıcı için T(herhangi bir sayıda tip parametresiyle)
    scala.Nothing <: T <: scala.Any
  • [...]

Nerede <:temelde anlamına gelen "bir tipidir".

Bunun nasıl yapıldığına gelince: Bilmiyoruz, derleyici büyüsü ve bir uygulama detayı.

Çoğu zaman bir dil, bir programcı olarak yapamayacağınız şeyleri yapar. Bir muadili olarak Nothing: Scala'daki Anyher şey miras , hariç her şey Any. Neden bir Anyşeyden miras almıyor ? Bunu yapamazsın. Scala bunu neden yapabilir? Çünkü Scala kuralları koydu, sen değil. Nothingher şeyin bir alt tipi olmak bunun sadece bir başka örneğidir.


10
BTW: Bu, nullJava'daki her tür alana atanabilmeyle tamamen aynıdır . Bu neden mümkün? Mı nullher sınıfın bir örneğidir? Hayır, mümkün çünkü derleyici böyle diyor. Dönemi.
Jörg W Mittag

8
Bunu yüzlerce kez oylayabilirsem, yapardım. Türleri ve sınıfları karıştırmak , Java gibi dillerin bize getirdiği en kötü şeylerden biridir.
Jörg W Mittag

1
Miras ve alt tipler arasındaki farkla ilgili meraklı ruhlar için cmi.ac.in/~madhavan/courses/pl2006/lecturenotes/lecture-notes/… ancak satın almıyorum - miras alırsanız ( extendsJava'da olduğu gibi ve beste olarak değil) ) sonuçta alt tip için yaparsınız.
greenoldman

11

Scala'nın birden fazla mirası desteklemediğini söylediğinde, bir yöntem uygulamasını birden çok kez devralmayı ifade eder. Tabii ki, bir sınıfta birden fazla arabirim / özellik uygulayabilir ve hatta aynı yöntemi tanımlayabilirler, ancak özellik doğrusallaştırması nedeniyle farklı uygulamalar arasında çakışma olmaz.

Bir sınıfı varsa Genelde, C1bir yöntem ile f()ve bir sınıf C2yöntemi ile de f()çoklu kalıtım aracı daha sonra, bir şekilde iki uygulamaları devralabilir f(). Bu, Scala'nın yalnızca tek bir sınıftan miras almanıza izin vererek ve birden fazla özellik olması durumunda özelliklerin sırasına göre bir uygulama seçerek çözdüğü çeşitli sorunlara yol açabilir.

İşlere gelince Nothing, gerçekten basittir, çünkü hiçbir şeyin tanımlanmış özniteliği veya yöntemi yoktur. Yani miras çatışmaları yaşayamazsınız. Ancak, sürprizinizin çoğunun farklı bir çoklu miras anlayışından geldiğini varsayıyorum.

Eğer özellik doğrusallaştırması etkili bir miras belirsizliği ortadan kaldırır ve bunu birden çok özelliklerin devralmaya atıfta olmadığını anladığınızda çoklu miras nedeniyle buna, o zaman iyi olmalıdır.

Bunun nasıl gerçekleştiğine gelince: derleyici bundan sorumludur. Bkz Scala dil özellikleri diğer özellikleri arasında içeren bölüm 3.5.2 uyumu:

For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.

Başka bir deyişle, bir derleyiciyi doğru bir şekilde uygulamak istiyorsanız, Nothingbelirtime göre her şeyin bir alt türü olarak işlemesi gerekir . Açık nedenlerden ötürü, Nothingsisteme yüklenen tüm sınıflardan uzatılacak şekilde tanımlanmamıştır, ancak Nothingalt tür olarak tanımlamanın uygunluğu, alt türlemenin ilgili olduğu tüm yerlerle sınırlıdır.

Burada önemli bir nokta, hiçbir tip örneğinin bulunmamasıdır Nothing, bu nedenle, tedavisi kesinlikle derleyicinin alanında olan tip kontrolüyle sınırlıdır.


2
Hala anlamadım, bunun nasıl yapıldığı ...
Sorumun

1
"Hiçbir şeyi alt tür olarak tanımlamanın önemi, alt türlemenin ilgili olduğu tüm yerlerle sınırlı değildir." Bununla ne iletmek istiyorsun? X, X'in ilgili olduğu yerde mi?
phant0m
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.