Ruby/Moduły: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Linia 2:
 
Moduły w Rubim są podobne do klas, ale:
 
* Moduł nie może mieć instancji.
* Moduł nie może mieć podklas.
* Moduł jest definiowany przez słowa kluczowe <tt>module</tt> i <tt>end</tt>.
 
Właściwie to... klasa <tt>Module</tt> modułu jest nadklasą klasy <tt>Class</tt> klasy<ref>To ma sens :). W Rubim obiektami są nawet klasy lub moduły i posiadają one swoje klasy (<tt>Module</tt> i <tt>Class</tt>).</ref>. Rozumiesz? Nie? Idźmy dalej.
 
Istnieją dwa typowe zastosowania modułów. Jedno to zebranie powiązanych metod i stałych w jednym centralnym miejscu. Moduł <tt>Math</tt> z standardowej biblioteki Rubiego odgrywa taką rolę:
 
<pre>
rubyirb(main):001:0> Math.sqrt(2)
=> 1.4142135623731
1.41421
rubyirb(main):002:0> Math::PI
=> 3.14159265358979
3.14159
irb(main):003:0>
</pre>
 
Linia 20 ⟶ 22:
 
<pre>
rubyirb(main):003:0> include Math
=> Object
rubyirb(main):004:0> sqrt(2)
=> 1.4142135623731
1.41421
rubyirb(main):005:0> PI
=> 3.14159265358979
3.14159
irb(main):006:0>
</pre>
 
=== Domieszkowanie klas ===
Inne użycie modułu nazywane jest domieszkowaniem klas (''mixin''). Niektóre języki obiektowe, włączając C++ lub Eiffel, pozwalają na wielokrotne dziedziczenie, to znaczy, dziedziczenie po więcej niż jednej nadklasie. Przykładem wielokrotnego dziedziczenia z codziennej rzeczywistości jest budzik. Możesz zaliczyć budziki do klasy zegarków jak i do klasy przedmiotów z brzęczykami.
 
Inne użycie modułu nazywane jest ''domieszkowaniem'' klas (ang. ''mixin''). Niektóre języki obiektowe, włączając C++ lub Eiffel, pozwalają na wielokrotne dziedziczenie, to znaczy, dziedziczenie po więcej niż jednej nadklasie. Przykładem wielokrotnego dziedziczenia z codziennej rzeczywistości jest budzik. Możesz zaliczyć budziki do klasy zegarków jak i do klasy przedmiotów z brzęczykami.
 
Ruby celowo nie implementuje prawdziwego wielokrotnego dziedziczenia, ale domieszkowanie klas jest dobrą alternatywą. Pamiętaj, że moduły nie mogą posiadać instancji ani podklas. Ale jeśli włączymy (<tt>include</tt>) moduł w definicję klasy, jego metody będą efektywnie dodane czy też "wmieszane" w klasę.
Linia 35 ⟶ 40:
 
Takie użycie modułów dostarcza podstawowej funkcjonalności wielokrotnego dziedziczenia, pozwalając jednocześnie, by relacje pomiędzy klasami były nadal reprezentowane za pomocą prostych struktur drzewiastych. W ten sposób upraszcza się znacząco implementacja języka (podobny punkt widzenia został przyjęty przez projektantów Javy).
 
=== Przykładowy moduł ===
 
 
 
<noinclude>
{{Przypisy}}