Bir sınıf için bir tamamlayıcı nesnenin (tekli) gerekli olduğu bir durum var mı? Neden bir sınıf oluşturmak isteyeyim, söyleyin Foo
ve bunun için bir tamamlayıcı nesne yaratayım?
Bir sınıf için bir tamamlayıcı nesnenin (tekli) gerekli olduğu bir durum var mı? Neden bir sınıf oluşturmak isteyeyim, söyleyin Foo
ve bunun için bir tamamlayıcı nesne yaratayım?
Yanıtlar:
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 Foo
ve FooFactory
her yerde, fabrika sorumluluklar eşlik nesne almak ile bir sınıf olabilir.
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
... 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.
'yeni' olmadan (gerçekten o kadar önemli değil)
farklı olası parametre kümeleriyle (Bloch'un etkili Java'da teleskop kurucu hakkında yazdıklarıyla karşılaştırın)
Ö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.
RealThing
ve AlternativeThing
sınıf private
, kullanıcıyı AbstractClass
has fabrikasını kullanmaya zorlayacak bir kurucuya sahip olmalıdır . class AlternativeThing private(i: Int) extends AbstractClass
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).
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.
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
İ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.