Przede wszystkim zwróć uwagę, że jestem C ++ i Pythonem, a nie Javą, więc niektóre z nich mogą nie mieć tak pełnego zastosowania. Popraw mnie, jeśli popełniam nieprawidłowe założenia dotyczące działania klas w Javie.
Klasy są przede wszystkim przydatne, gdy są tworzone. Klasa, w której nie są tworzone żadne instancje, jest naprawdę tylko uwielbioną przestrzenią nazw. Jeśli użyjesz wszystkich swoich klas w ten sposób, wówczas korzyści płynące z przenoszenia rzeczy z przestrzeni nazw do przestrzeni nazw mogą wydawać się nieistotne - co najwyżej wygrasz, posiadając prywatne dane w każdej z nich, a tym samym nieco podsumowując.
Jednak nie w tym miejscu zabłysną klasy. Zastanów się nad String
klasą: możesz mieć te same funkcje za pomocą char
tablic i niektórych funkcji statycznych. W tym momencie funkcje dają ci trochę więcej bezpieczeństwa i cukru syntaktycznego. Możesz pisać string.length()
zamiast length(char_array)
; to nie jest wielka sprawa, ale wielu ludzi nadal to lubi. Co więcej, wiesz, że jeśli ktoś ci dał String
, został utworzony za pomocą String
konstruktora i że musi działać z length
funkcją - jeśli wersja tablicowa nie może obsłużyć jakiegoś znaku, to nie ma żadnego sposobu, aby uniemożliwić ci umieszczenie go tam .
Ale wciąż nie o to chodzi. Kluczową kwestią jest to, że klasy łączą dane i funkcje, które na nich działają, i usuwają je obie. Kiedy masz metodę void f(Builder b)
, wiesz, że dostaniesz Builder
, i możesz oczekiwać, że będzie ona wspierać określone zachowanie. Jednak nic nie wiesz o danych ani wykonywanych funkcjach - w rzeczywistości definicje obu mogą nie zostać jeszcze napisane podczas pisania i kompilacji f
.
Pierwszym punktem, który należy zrozumieć, jest to, że klasy ułatwiają przekazywanie danych, jednocześnie upewniając się, że nie są uszkodzone. Po drugie, zarówno to, jakie dane, jak i jaką funkcję (implementację) ma obiekt, jest czymś o obiekcie, a nie czymś, co można po prostu powiedzieć po jego typie.