olvasási idő: 4 perc
a társobjektumok használatának megértése érdekében fontos, hogy először megértsük a statikus tagokat. Megtanultuk, hogy az objektumorientált nyelvekben az osztályok a tervrajz, amely tagokat, például mezőket és módszereket tartalmaz. De ahhoz, hogy hozzáférjünk ezekhez a mezőkhöz vagy metódusokhoz, először meg kell építenünk az objektumokat ezekből az osztályokból.
nézzünk meg egy példát.
class Math { private val max = 100 def sum(a: Int, b: Int): Int = a + b}object Test { def main(args: Array): Unit = { val math = new Math() math.sum(5, 10) }}
létrehoztunk egy Math nevű osztályt egy sum nevű módszerrel, amely két számot vesz fel, és az eredményt adja vissza.
ennek a kódnak a végrehajtásához létrehozunk egy példányt ebből a matematikai osztályból, és meghívjuk a sum metódust, megkerülve az 5-öt és a 10-et, 15-öt fogadva kimenetként. Amint azonban látjuk, az összeg módszer nem függ a matematikai osztály egyik tagváltozójától sem.
például a max tag változó ebben az esetben. Tehát nem kell létrehozni a matematikai osztály példányát az összeg metódus meghívásához. Ebben az esetben ezt közvetlenül meg kell tudnunk hívni. És ez az, ahol a társ tárgyak jönnek a képbe.
négy dolgot kell megjegyeznünk a társobjektumokról:
1. Ugyanaz a nevük, mint a megfelelő osztálynak.
2. Az “objektum” kulcsszóval kezdődnek.
3. Ugyanabban a forrásfájlban élnek, mint a megfelelő osztályok.
4. A társ objektumok és a hozzájuk tartozó osztályok egymás privát tagjaiként működnek.
az “object” kulcsszó azt mondja, hogy ez egy egyedülálló objektum. Más szavakkal, ez azt jelenti, hogy amíg a program fut, annyi példányt hozhat létre az osztályokból, amennyit csak akar, de a singleton objektum csak egy lenne, és nem lesz több példánya.
lássuk őket működés közben a matematikai példánk segítségével.
object Math { def sum(a: Int, b: Int): Int = a + b def getPrivateMember: Int = = new Math().max}class Math { private val max = 100}object Test { def main(args: Array): Unit = { Math.sum(5, 10) Math.getPrivateMember }}
mint látjuk, létrehoztunk egy új szingulett objektumot, a Math nevet, amelynek ugyanaz a neve, mint az osztálymatekunknak. Az “objektum” kulcsszóval kezdődik, és ugyanabban a fájlban marad, mint a Math osztály.
áthelyeztük az összeg implementációját az osztályból a társobjektumába. Ennek oka az, hogy mivel tudjuk, hogy az összeg implementáció nem függ a Math osztály tagváltozóitól, az implementáció beillesztése a companion objektumba segít a hívóknak abban, hogy ne hozzák létre a Math osztály példányát, és közvetlenül hívják meg.
van egy másik módszer, amelyet írtunk annak bemutatására, hogy a társobjektum hozzáfér az osztályának privát tagjaihoz.
itt a Getprivatemember példányosítja a matematikai osztályt, és visszaadja a “max”nevű privát tagot. Van még egy dolog, amit itt meg kell jegyezni. A getPrivateMember meghatározásakor nem helyeztük el a zárójeleket. A Scala-ban van egy konvenció, amelyben ha a módszer nem tartalmaz érveket, és nem végez semmilyen mellékhatást, ami azt jelenti, hogy ez egy tiszta funkció, akkor dönthetünk úgy, hogy elhagyjuk a zárójeleket.
itt a getprivatemember csak a tagváltozó értékét adja vissza, ezért úgy döntünk, hogy kihagyjuk a zárójeleket.
Math.sum(5, 10)Math.getPrivateMember
amikor végrehajtjuk a sum metódust, a Math companion objektumból hajtottuk végre, és nem kellett létrehoznunk a Math class új példányát. Ezenkívül hozzáférhettünk a Math osztály privát tagváltozójához a companion objektumból.
objektumok létrehozása az Apply használatával
tudjuk, hogy egy objektum új példányának létrehozásához az “új” kulcsszót kell használnunk.
például:
class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}
van egy “személy” nevű osztályunk, amelynek keresztneve és vezetékneve az osztály paraméterei. Létrehozunk egy új személypéldányt a fentiek szerint. Létrehoztuk az “alice” – t, mint egy új személyt, átadva a keresztnevet és a vezetéknevet.
a Scalában azonban van még egy módszer objektumok létrehozására az új kulcsszó használata nélkül.
van egy “apply” nevű módszer a companion object-ben, amelyet kifejezetten a Scala fordító kezel, és lehetővé teszi az osztályok új példányainak létrehozását az új kulcsszó nélkül. Tanuljuk meg, hogyan kell használni a kódunkban.
object Person { def apply(firstName: String, lastName: String): Person = new Person(firstName, lastName)}class Person(firstName: String, lastName: String) { def getName: String = firstName + " " + lastName}object Test { def main(args: Array): Unit = { val alice = Person("Alice", "Christy") println(p.getName) }}
mint itt látjuk, létrehoztunk egy társobjektumot az apply metódussal. A Person osztály egy példányának létrehozásához szükséges érveket tartalmazza, belsőleg létrehozza a Person példányt, és visszaadja a példányt. Mint látjuk, az új kulcsszó használata nélkül hoztuk létre a person osztály példányát. És hozzáférhetünk a tagokhoz, mint bármely más tárgyhoz. 6
ez az egész a Companion objektum ebben a blogban. Tanulj Tovább, Növekedj Tovább!!!