7.9. Metody bezparametrowe
Definicja metody może zawierać mniej lub więcej, niż jedną listę parametrów. Zacznijmy od tego pierwszego przypadku. Metoda bezparametrowa to metoda, która nie ma listy parametrów. Definicja takiej metody znajduje się w pliku NoParameters1.scala.
Plik NoParameters1.scala: def greet1 = 'Hi
Metoda greet nie ma zdefiniowanej listy parametrów — nawet pustej. Wywołanie takiej metody następuje poprzez odwołanie do jej nazwy bez dodawania do niej nawiasów okrągłych.
scala> :load NoParameters1.scala Loading NoParameters1.scala... greet1: Symbol
scala> greet1 res0: Symbol = 'Hi
Jeśli spróbujemy dodać nawiasy do wywołania tej metody, to otrzymamy błąd.
scala> greet1()
<console>:12: error: Symbol does not take parameters
greet1()
^
Metoda greet została wywołana i zwróciła rezultat w postaci obiektu typu Symbol. Kompilator nie powiązał nawiasów z wywołaniem tej metody, ale próbował zastosować je do jej rezultatu.
Oprócz metod bezparametrowych istnieją też metody posiadające pustą listę parametrów. Definicja takiej metody znajduje się w pliku NoParameters2.scala.
Plik NoParameters2.scala: def greet2() = 'Hi
Takie metody możemy wywoływać zarówno dodając do ich nazwy nawiasy, jak i pomijając je. Obydwa poniższe wywołania metody greet2 działają.
scala> :load NoParameters2.scala Loading NoParameters2.scala... greet2: ()Symbol scala> greet2 res2: Symbol = 'Hi scala> greet2() res3: Symbol = 'Hi
W tej samej klasie lub obiekcie nie można umieścić metod bezparametrowej i z pustą listą parametrów, posiadających taką samą nazwę.
Plik NoParameters3.scala: class Hi { def greet = 'Hi1 def greet() = 'Hi2 }
Definicja klasy Hi z pliku NoParameters3.scala nie kompiluje się z tego powodu.
scala> :load NoParameters3.scala
Loading NoParameters3.scala...
<console>:12: error: method greet is defined twice
conflicting symbols both originated in file '<console>'
def greet() = 'Hi2
^
Metodę bezparametrową można nadpisać w klasie potomnej metodą z pustą listą parametrów. Metodę z pustą listą parametrów można nadpisać w klasie potomnej metodą bezparametrową. W obu przypadkach metoda klasy potomnej jest metodą z pustą listą parametrów. W pliku NoParameters4.scala znajduje się przykład, w którym metoda greet, z klasy Hello4, posiada pustą listę parametrów, a nadpisuje metodę bezparametrową z klasy bazowej.
Plik NoParameters4.scala: class Greeting4 { def greet = 'Hi } class Hello4 extends Greeting4 { override def greet() = 'Hello }
Metodę greet można wywołać tak, jak inne metody z pustą listą parametrów, czyli podając lub opuszczając nawiasy.
scala> val hello4 = new Hello4 hello4: Hello4 = Hello4@a36a66 scala> hello4.greet res4: Symbol = 'Hello scala> hello4.greet() res5: Symbol = 'Hello
W pliku NoParameters5.scala znajduje się przykład, w którym metoda greet, z klasy Hello5, nie posiada listy parametrów, a nadpisuje metodę z pustą listą parametrów z klasy bazowej.
Plik NoParameters5.scala: class Greeting5 { def greet() = 'Hi } class Hello5 extends Greeting5 { override def greet = 'Hello }
Mimo że definicja metody greet w klasie Hello5 nie ma listy parametrów, to ta metoda posiada pustą listę parametrów, gdyż nadpisuje metodę z pustą listą parametrów.
scala> val hello5 = new Hello5 hello5: Hello5 = Hello5@106f20f scala> hello5.greet res6: Symbol = 'Hello scala> hello5.greet() res7: Symbol = 'Hello
Oba powyższe sposoby wywołania działają. Nadpisując metodę, która ma pustą listę parametrów inną metodą, nie można pozbawić jej tej listy parametrów. Nawet zdefiniowanie w klasie podrzędnej metody bez listy parametrów nie skutkuje utworzeniem metody bezparametrowej.
Metody bezparametrowe oraz metody posiadające pustą listę parametrów można nadpisać w klasie podrzędnej wartościami niezmiennymi definiowanymi z użyciem słowa kluczowego val. Przykłady takich sytuacji znajdują się w pliku NoParameters6.scala.
Plik NoParameters6.scala: class Greeting6 { def greet = 'Hi } class Welcome6 extends Greeting6 { override val greet = 'Welcome } class Greeting7 { def greet() = 'Hi } class Welcome7 extends Greeting7 { override val greet = 'Welcome }
W obu przypadkach możemy odwoływać się do takiej wartości niezmiennej bez stosowania nawiasów.
scala> val welcome6 = new Welcome6 welcome6: Welcome6 = Welcome6@997338 scala> val welcome7 = new Welcome7 welcome7: Welcome7 = Welcome7@177a04f scala> welcome6.greet res8: Symbol = 'Welcome scala> welcome7.greet res9: Symbol = 'Welcome
Próba zastosowania nawiasów kończy się w tym przypadku komunikatem o błędzie.
scala> welcome6.greet()
<console>:12: error: Symbol does not take parameters
welcome6.greet()
^
scala> welcome7.greet()
<console>:12: error: Symbol does not take parameters
welcome7.greet()
^
Plik NoParameters1.scala:
def greet1 = 'Hi
