czas odczytu: 4 minuty
aby zrozumieć użycie obiektów towarzyszących, ważne jest, aby najpierw zrozumieć elementy statyczne. Dowiedzieliśmy się, że w językach obiektowych klasy są wzorcem zawierającym elementy takie jak pola i metody. Ale aby uzyskać dostęp do tych pól lub metod, musimy najpierw skonstruować obiekty z tych klas.
spójrzmy na przykład.
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) }}
stworzyliśmy klasę o nazwie Math z metodą sum, która przyjmuje dwie liczby i Zwraca sumę jako wynik.
w celu wykonania tego kodu, tworzymy instancję tej klasy matematycznej i wywołujemy metodę sum omijając 5 i 10, otrzymując 15 jako wynik. Jednak, jak widzimy, metoda sum nie jest zależna od żadnej ze zmiennych członkowskich klasy matematycznej.
na przykład zmienna Max member w tym przypadku. Tak więc, nie powinno być potrzeby tworzenia instancji klasy Math w celu wywołania metody sum. Powinniśmy być w stanie nazwać to bezpośrednio w tym przypadku. I tu pojawiają się obiekty towarzyszące.
są cztery rzeczy, o których musimy pamiętać o obiektach towarzyszących:
1. Mają tę samą nazwę, co odpowiadająca im Klasa.
2. Zaczynają się od słowa kluczowego” obiekt”.
3. Żyją w tym samym pliku źródłowym, co odpowiednie klasy.
4. Obiekty towarzyszące i odpowiadające im klasy działają jak członkowie prywatni innych.
słowo kluczowe „object” mówi, że jest to obiekt singleton. Innymi słowy, oznacza to, że podczas działania programu możesz utworzyć tyle instancji ze swoich klas, ile chcesz, ale obiekt singleton będzie tylko jednym i nie będzie wielu jego instancji.
zobaczmy je w akcji na przykładzie matematyki.
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 }}
jak widzimy, stworzyliśmy nowy obiekt singleton o nazwie Math, który ma taką samą nazwę jak Nasza klasa Math. Zaczyna się również od słowa kluczowego” object ” i pozostaje w tym samym pliku co klasa Math.
przenieśliśmy implementację dla sumy z klasy do jej obiektu towarzyszącego. Dzieje się tak, ponieważ, jak wiemy, implementacja sum nie jest zależna od zmiennych członkowskich klasy Math, umieszczenie tej implementacji w obiekcie towarzyszącym pomoże wywoływaczom nie tworzyć instancji klasy Math i wywoływać ją bezpośrednio.
istnieje inna metoda, którą napisaliśmy, aby pokazać, że obiekt towarzyszący ma dostęp do prywatnych członków swojej klasy.
tutaj getprivatemember tworzy instancję klasy matematycznej i zwraca jej prywatny członek o nazwie „max”. Jest jeszcze jedna rzecz, na którą należy zwrócić uwagę. Kiedy definiujemy getPrivateMember, nie umieszczamy nawiasów. W Scali istnieje Konwencja, w której jeśli metoda nie ma argumentów do przyjęcia i nie wykonuje żadnego efektu ubocznego, co oznacza, że jest to czysta funkcja, możemy pominąć nawiasy.
tutaj getPrivateMember zwraca tylko wartość zmiennej member, więc wybieramy pominięcie nawiasów.
Math.sum(5, 10)Math.getPrivateMember
wykonując metodę sum, wykonaliśmy ją z obiektu math companion i nie musieliśmy tworzyć nowej instancji klasy Math. Dodatkowo mogliśmy uzyskać dostęp do zmiennej Private member klasy matematycznej z obiektu towarzyszącego.
Tworzenie obiektów przy użyciu Apply
wiemy, że aby utworzyć nową instancję obiektu, musimy użyć słowa kluczowego „new”.
na przykład:
class Person(firstName: String, lastName: String) {def getName: String = firstName + lastName}object Test { def main(args: Array): Unit = { val alice = new Person("Alice", "Christy") }}
mamy klasę o nazwie „Person” z imieniem i nazwiskiem jako parametrami klasy. I tworzymy nową instancję Person, jak pokazano powyżej. Stworzyliśmy „alice” jako nową osobę, podając imię i nazwisko.
jednak w Scali istnieje jeszcze jeden sposób tworzenia obiektów bez użycia słowa kluczowego new.
istnieje metoda o nazwie „apply” w obiekcie towarzyszącym, która jest traktowana specjalnie przez kompilator Scali i pozwala nam tworzyć nowe instancje klas bez konieczności użycia nowego słowa kluczowego. Dowiedzmy się, jak używać go w naszym kodzie.
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) }}
jak widzimy tutaj, stworzyliśmy obiekt towarzyszący z zastosowaniem metody do niego. Pobiera argumenty, których potrzebujemy do utworzenia instancji klasy Person, tworzy instancję Person wewnętrznie i zwraca instancję. Jak widzimy, stworzyliśmy instancję klasy Person bez użycia słowa kluczowego new. I możemy uzyskać dostęp do członków, tak jak każdy inny obiekt. 🙂
to wszystko o obiekcie towarzyszącym z tego bloga. Ucz Się, Rozwijaj Się!!!