Mühürlü özellik nedir?


332

Mühürlü sınıflar 'Scala'da Programlama' bölümünde açıklanmıştır, ancak mühürlü özellikler açıklanmamıştır. Kapalı bir özellik hakkında daha fazla bilgiyi nerede bulabilirim?

Mühürlü bir özellik mühürlü bir sınıfla aynı olup olmadığını bilmek isterim? Ya da değilse, farklar nelerdir? Kapalı bir özelliği kullanmak ne zaman iyi bir fikirdir (ve değil)?

Yanıtlar:


473

Bir sealedözellik yalnızca bildirimi ile aynı dosyada genişletilebilir.

Genellikle bir alternatif sağlamak için kullanılırlar enums. Yalnızca tek bir dosyada genişletilebildiğinden, derleyici olası tüm alt türleri bilir ve bunun için akıl yürütebilir.

Örneğin beyan ile:

sealed trait Answer
case object Yes extends Answer
case object No extends Answer

Eğer bir maç tam kapsamlı değilse derleyici bir uyarı verecektir:

scala> val x: Answer = Yes
x: Answer = Yes

scala> x match {
     |   case No => println("No")
     | }
<console>:12: warning: match is not exhaustive!
missing combination            Yes

Bu nedenle, olası alt tiplerin sayısı sınırlıysa ve önceden biliniyorsa, kapalı özellikler (veya kapalı soyut sınıf) kullanmalısınız. Daha fazla örnek için liste ve seçenek uygulamalarına göz atabilirsiniz .


113
buraya rastgele gelmem ve Scala'daki Java Enum'un nasıl değiştirileceğini anlamam altı ay sürdü.
sscarduzio

1
çok hoş ! yalnızca sonlu ve önceden bilinmeyen değil, evet gibi tüm olası alt türleri de kontrol etmenin mantıklı olduğu sınırlı (mühürlü?) bağlamın bir parçası. hayır, hatta | garip vb ...
Mário de Sá Vera

90

mühürlü bir özellik mühürlü bir sınıfla aynı mıdır?

Gidebildiği kadarıyla sealed, evet. Elbette traitve arasındaki normal farkları paylaşırlar class.

Ya da değilse, farklar nelerdir?

Farazi.

Kapalı bir özelliği kullanmak ne zaman iyi bir fikirdir (ve değil)?

Eğer varsa sealed class X, o zaman Xalt sınıfların yanı sıra kontrol etmeniz gerekir . Aynı şey sealed abstract class Xveya için de geçerli değildir sealed trait X. Yani yapabilirsin sealed abstract class X, ama bu sadece traitve az avantaj için çok daha ayrıntılı .

abstract classOver a kullanmanın ana avantajı, traitparametreleri alabilmesidir. Bu avantaj özellikle tip sınıflarını kullanırken önemlidir. Diyelim ki sıralı bir ağaç inşa etmek istiyorsunuz. Bunu yazabilirsiniz:

sealed abstract class Tree[T : Ordering]

ama bunu yapamazsın:

sealed trait Tree[T : Ordering]

çünkü bağlam sınırları (ve görünüm sınırları) örtük parametrelerle uygulanır. Özelliklerin parametre alamadığı göz önüne alındığında, bunu yapamazsınız.

Şahsen, sealed traitbelirli bir sebep beni kullanmazsa tercih ederim ve kullanıyorum sealed abstract class. Ve ince nedenlerden bahsetmiyorum, ama tip sınıflarını kullanmak gibi görmezden gelemediğiniz yüz yüze nedenler.


"bağlam sınırları (ve görünüm sınırları) örtük parametrelerle uygulandığından." - Bunu biraz açıklayabilir misin?
Ruby

@Kapalı - oldukça geç yanıt, ancak siz veya başka birinin ilgilenmesi durumunda: bağlam sınırlaması ( [A: F]), varyans kısıtlamaları ile aynı şekilde çalışmaz. Aksine, örtük bir F[A]kapsam gerektiren sözdizimsel şekerdir . Genelde, örnek sınıf örneklerini, örtük bir parametreden ( (implicit fa: F[A])) daha biraz daha kolay ve okunması kolay bir şekilde çağırmak için kullanılır , ancak yine de başlık altında aynı şekilde çalışır ve Daniel'ın belirttiği gibi, özellikler yapmaz söyledi.
mirichan

54

Gönderen günlük scala blogda :

Bir özellik "mühürlendiğinde" tüm alt sınıfları aynı dosya içinde bildirilir ve bu da alt sınıf kümesini belirli derleyici kontrollerine izin veren sonlu yapar.


Teşekkür ederim. "Tüm alt sınıfları" ile sınıflar ve özellikler anlamına mı geliyor?
John Threepwood

@John - Denemedim, ama sınıflardan şüpheleniyorum. Sızdırmazlık ile ilgili nokta, her şeyin bir kaynak birim içinde tanımlanmasıdır
Brian Agnew

1
@JohnThreepwood: sınıflar, özellikler ve nesneler. Scala'da çoğu zaman "sınıf" terimi, sınıfları, özellikleri ve nesneleri ifade etmek için kullanılır. Sadece aralarındaki belirli farklardan bahsederken, sadece sınıflar anlamına gelir . SLS, hem sınıflara hem de özelliklere atıfta bulunmak için "şablon" terimini kullanır, ancak bu terim SLS'nin dışında çok fazla kullanılmaz ve sınıfların, özelliklerin ve nesnelerin üçünü de kapsayan hiçbir terim yoktur.
Jörg W Mittag

30

Ayrıca özellikleri belirtmek gerekir hissediyorum:

Mühürlü modi fi er fi tanımlamaların de sınıfları için geçerlidir. Bir mühürlü sınıf doğrudan devralan şablon miras sınıfı aynı kaynak dosyada tanımlandığını ise haricinde kalıtsal olabilir. Ancak, kapalı bir sınıfın alt sınıfları her yerde devralınabilir.

- M. Odersky. Scala dil belirtimi, sürüm 2.8. çevrimiçi, Eylül., 2013.


7

Kısaca:

  • Kapalı özellikler yalnızca aynı dosyada genişletilebilir
  • Bu, derleyicinin tüm olası alt türleri kolayca bilmesini sağlar
  • Muhtemel alt tiplerin sayısı sınırlı ve önceden biliniyorsa kapalı özellikler kullanın
  • Java'da numaralandırma gibi bir şey yaratmanın bir yolu
  • Cebirsel veri türlerinin (ADT) tanımlanmasına yardımcı olun

ve daha fazla bilgi için Scala'daki kapalı özellikler hakkında her şey

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.