Fark

2010-01-05 13 views
72

Olası Çoğalt:
Scala traits vs abstract classesFark

soyut sınıflar ve özellikleri arasındaki kavramsal fark nedir?

+1

sen http://stackoverflow.com/questions/1991042/scala-traits-vs-abstract-classes gördün mü? Bu SO sorusunda bazı cevap öğeleri vardır. – VonC

cevap

60

bir sınıfı, sadece extend one superclass ve böylece tek bir özet sınıfı. Birkaç sınıf oluşturmak isterseniz, Scala yolu mixin class composition'u kullanmaktır: bir (isteğe bağlı) süper sınıfı, kendi üye tanımlarınızı ve bir veya daha fazla traits'u birleştirirsiniz. Bir özellik, kurucu parametrelere sahip olmamak kaydıyla sınıflara göre kısıtlanmıştır (scala reference manual'u karşılaştırın). sınıflara kıyasla özelliklerin

kısıtlamalar Çoklu kalıtımın tipik sorunlardan kaçınmak tanıtılmaktadır. Miras hiyerarşisine göre daha fazla veya daha az karmaşık kurallar vardır; Bunun gerçekten önemli olduğu bir hiyerarşiden kaçınmak en iyisi olabilir. ;-) Anladığım kadarıyla, yalnızca iki farklı özellikten aynı isme sahip iki imzayı/iki değişkenle miras almanız önemli olabilir.

+0

Hiyerarşiniz bir ağaç olduğu sürece karmaşık senaryolara giremezsiniz. – Raphael

+0

@edit: Aynı özelliği miras alan süper olmayanlar olmadan da anlaşmazlıklarınız olabilir. Aynı isim ve parametre (tip) listesiyle iki yöntem çakışır. – Raphael

+0

@Raphael Güzel nokta. Bunu açıklığa kavuşturmaya çalıştım. Şimdi doğru mu? –

5

En azından Scala'da, özellikler sistemi, birden fazla devralma ile ilişkili tipik sorunlardan kaçınmak için bir alt sınıfta ana önceliği bildirmenin açık bir yoluna, yani aynı imzası olan devralınan yöntemlerle çakışmalara sahiptir.

Özellikler, Java arabirimlerine benzer, ancak yöntem uygulamalarına izin verilir.

+0

Bağlama önceliği, yalnızca kendi özellikleriyle değil, ancak süper tip listesinin doğrusallaştırılmasıyla çözülmez. Aynı şeyi çok sınıflı kalıtımla da yapabilirsiniz. – Raphael

12

Kavramsal olarak, bir özellik kendi başına bir sınıf değil, bir sınıfın bileşenidir. Bu nedenle, genellikle kurucuları yoktur ve "kendi başına" durmak anlamına gelmez.

Ben bağımsız bir anlamı vardır ve özellikleri zaman sadece bir nesne yönelimli bir şekilde işlevsellik eklemek istediğinizde soyut sınıfını kullanarak önermek. İki arasında emin değilseniz, tüm yöntemleriniz tek bir şey etrafında dönüyorsa, büyük olasılıkla bir özellik isteyebilirsiniz. Bir (non-dile özgü) Örneğin

, sizin Çalışan "Kişi" ve "klonlanamaz" hem uzatmak gerekiyorsa, Kişi bir temel sınıf ve klonlanamaz bir özellik olun. özelliklerin

+1

Tüm yöntemler tek bir şey etrafında dönerken, tasarımınızın tamam olduğunu söylerim (Tek sorumluluk ilkesi: http://en.wikipedia.org/wiki/Single_responsibility_principle). Aksi halde tasarım, kabul edilebilir bir uzlaşma olmalıdır. –

+0

Haklısın, cevabımı biraz açıklığa kavuşturdum. – Oak

49

bir yönü onlar istiflenebilir olmasıdır. Kısıtlı bir AOP formuna izin verilmesi (tavsiye etrafında).

trait A{ 
    def a = 1 
} 

trait X extends A{ 
    override def a = { 
     println("X") 
     super.a 
    } 
} 


trait Y extends A{ 
    override def a = { 
     println("Y") 
     super.a 
    } 
} 

scala> val xy = new AnyRef with X with Y 
xy: java.lang.Object with X with Y = [email protected] 
scala> xy.a 
Y 
X 
res0: Int = 1 

scala> val yx = new AnyRef with Y with X 
yx: java.lang.Object with Y with X = [email protected] 
scala> yx.a 
X 
Y 
res1: Int = 1 

super çözünürlüğü miras hiyerarşisinin doğrusallaşma yansıtır.

+2

cool ... Ya iki karakter ** X ** ve ** Y **, def ** a ** için farklı değerler üretirse? –