Scala'da eşlik eden nesnelere sahip olmanın ardındaki mantık nedir?


Yanıtlar:


82

Tamamlayıcı nesne temelde "statik benzeri" yöntemlerin yerleştirilebileceği bir yer sağlar. Ayrıca, bir tamamlayıcı nesne veya eşlik eden modül, özel olanlar da dahil olmak üzere sınıf üyelerine tam erişime sahiptir.

Tamamlayıcı nesneler, fabrika yöntemleri gibi şeyleri kapsüllemek için harikadır. Bunun yerine, örneğin var zorunda Foove FooFactoryher yerde, fabrika sorumluluklar eşlik nesne almak ile bir sınıf olabilir.


61

Tamamlayıcı nesneler, bir sınıfın tüm örneklerinde ortak olan durum ve yöntemleri depolamak için kullanışlıdır, ancak statik yöntemler veya alanlar kullanmazlar. Kalıtım yoluyla geçersiz kılınabilen normal sanal yöntemler kullanırlar. Scala'nın gerçekten statik hiçbir şeyi yoktur. Bunu kullanmanın birçok yolu var ama işte basit bir örnek.

abstract class AnimalCounter
{
    var animals = 0

    def name: String

    def count()
    {
        animals += 1
        println("%d %ss created so far".format(animals, name))
    }
}

abstract class Animal
{
    def companion: AnimalCounter
    companion.count()
}

object Dog extends AnimalCounter
{
    val name = "dog"
}

class Dog extends Animal
{
    def companion = Dog
}

object Cat extends AnimalCounter
{
    val name = "cat"
}

class Cat extends Animal
{
    def companion = Cat
}

Bu çıktıyı üreten:

scala> new Dog
1 dogs created so far

scala> new Cat
1 cats created so far

scala> new Dog
2 dogs created so far

scala> new Cat
2 cats created so far

1
benzer illüstrasyon burada da bulunabilir: daily-scala.blogspot.sk/2009/09/companion-object.html
xhudik

30

... ve eşlik eden sınıflar için statik fabrika yöntemlerini (DP değil) depolamak için iyi bir yerdir. Bu aşırı yüklenmiş fabrika yöntemlerini uygularsanız (/ ... /) sınıfınızı oluşturabilir / başlatabilirsiniz.

  1. 'yeni' olmadan (gerçekten o kadar önemli değil)

  2. farklı olası parametre kümeleriyle (Bloch'un etkili Java'da teleskop kurucu hakkında yazdıklarıyla karşılaştırın)

  3. Özet (eşlik eden) yerine hangi türetilmiş sınıfı oluşturmak istediğinize karar verebilme yeteneği ile

Örnek kod:

abstract class AbstractClass;
class RealThing(s: String) extends AbstractClass;
class AlternativeThing(i: Int) extends AbstractClass;
object AbstractClass {
  def apply(s: String) = {
    new RealThing(s)
  }
  def apply(i: Int) = {
    new AlternativeThing(i)
  }
}

// somewhere else you can
val vs = AbstractClass("asdf")  // gives you the RealThing wrapped over string
val vi = AbstractClass(123)  // gives you AlternativeThing wrapped over int

AbstractXxxxx nesne / temel sınıfını çağırmazdım çünkü kötü görünmüyor: soyut bir şey yaratmak gibi. Bu isimlere gerçek bir anlam verin. Değişmez, yöntemi daha az, durum sınıfları kullanmayı düşünün ve soyut temel sınıfı mühürleyin.


2
RealThingve AlternativeThingsınıf private, kullanıcıyı AbstractClasshas fabrikasını kullanmaya zorlayacak bir kurucuya sahip olmalıdır . class AlternativeThing private(i: Int) extends AbstractClass
2014

@ [Szymon Jachim] Scala soyut sınıfı çoklu kalıtımı desteklemiyor. Peki sizin durumunuzda derleyici neden buna izin veriyor?
user2441441

19

Saem söyledi şeylerin yanı sıra onun cevapta , Scala derleyici de arar örtülü dönüşüm dönüşümleri ithal edilmesi gerek kalmaz, (kaynak veya hedef ya) karşılık gelen arkadaşı nesneleri türleri.

Scala'da Programlama genel olarak tekli nesnelerin nedeni hakkında şunları söylüyor:

Bölüm 1'de bahsedildiği gibi, Scala'nın Java'dan daha nesne yönelimli olmasının bir yolu, Scala'daki sınıfların statik üyelere sahip olmamasıdır. Bunun yerine, Scala'nın tekli nesneleri vardır (s. 65).


3

Scala'da hem işlevsel hem de nesne yönelimli kod yazmak için eşlik eden nesneleri her zaman bir köprü olarak görüyorum . Çoğu zaman, bir miktar girdi alan ve bir işlem sonucu sağlayan saf fonksiyonlara ihtiyacımız vardır. Bu ilgili işlevleri eşlik eden nesneye koymak, kendim için ve kodumun üzerine bir bina için bakmayı ve kullanmayı kolaylaştırır.

Üstelik tekil kalıbı hiçbir şey yapmadan yazmak için sağlanan bir dil özelliğidir. Bu, özellikle JVM'nin ömrü boyunca bir delege edeni kapsüllemek için bir singleton'a ihtiyacınız olduğunda kullanışlıdır. Örneğin, Scala'da basit bir HTTP istemci kitaplığı yazmak, burada temel bir Java uygulaması tabanlı yetkilendiriciyi kapsülleyebilir ve API'nizin tüketicilerinin saf dünyada yaşamasına izin verebilirsiniz.


0

Sınıfı ve nesneyi aynı adla aynı dosyada tanımlarsanız, bunlar tamamlayıcı sınıf ve nesne olarak bilinir. Scala, JAVA anahtar kelimesi olarak statik içermez, Scala'daki tamamlayıcı sınıf ve nesne ile statik yerine geçebilirsiniz.

Daha ayrıntılı bilgi için lütfen scala programlamada makale sınıfını ve nesne anahtar kelimesini kontrol edin


-1

İlk olarak, statik ve statik olmayan yöntem yöntemlerinin net bir şekilde ayrılmasını sağlar ve ayrıca singleton sınıfı oluşturmanın basit bir yolunu sağlar.

Ayrıca, Java statik yöntemleriyle yapılamayan diğer sınıflardan ve / veya özelliklerden yöntemleri miras alabilir ve bir parametre olarak aktarılabilir.

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.