Evgenii Legotckoi
Evgenii Legotckoi27. Juni 2016 02:43

Benutzerhandbuch #15 - Ruby - Zugangskontrolle

Vor kurzem haben wir gesagt, dass Ruby keine Funktionen hat, sondern nur Methoden. Es gibt jedoch mehr als eine Methode. In diesem Kapitel werfen wir einen Blick auf die Zugangskontrolle.

Überlegen Sie, was passiert, wenn wir eine Methode auf der obersten Ebene definieren, nicht innerhalb einer Klassendefinition. Wir könnten denken, dass diese Methode einer Funktion in einer traditionelleren Sprache wie C ähnelt.

ruby> def square(n)
    |   n * n
    | end
   nil
ruby> square(5)
   25

Unsere neue Methode scheint zu keiner Klasse zu gehören, aber Ruby gibt ihr die Klasse * Object *, die die Oberklasse jeder anderen Klasse ist. Daher kann jedes Objekt diese Methode verwenden. Das stimmt, aber es gibt einen kleinen Haken: Es ist eine private Methode für jede Klasse. Wir werden weiter unten besprechen, was dies bedeutet, aber eine der Auswirkungen davon ist, dass es nur in einem Funktionsstil wie diesem aufgerufen werden kann:

ruby> class Foo
    |   def fourth_power_of(x)
    |     square(x) * square(x)
    |   end
    | end
  nil
ruby> Foo.new.fourth_power_of 10
  10000

Wir dürfen diese Methode nicht als Methode eines Objekts ausführen:

ruby> "fish".square(5)
ERR: (eval):1: private method `square' called for "fish":String

Dies hält die objektorientierte Natur von Ruby sauberer (Funktionen sind immer noch Methoden des Objekts, aber der Empfänger ist implizit * self *), während Funktionen in einer traditionellen Sprache geschrieben werden können.

Der traditionelle Ansatz in der objektorientierten Programmierung, auf den wir in den letzten Kapiteln hingewiesen haben, ist die Aufteilung in Spezifikation und Implementierung bzw. welche Aufgaben ein Objekt erfüllen soll und wie diese tatsächlich ausgeführt werden. Das Innenleben des Objekts sollte in der Regel vor Benutzern verborgen bleiben. Sie müssen sich nur darum kümmern, welche Daten aus- und in das Objekt eingehen, und darauf vertrauen, dass das Objekt weiß, was mit den Daten in sich selbst zu tun ist. Daher ist es für Klassen oft nützlich, Methoden zu haben, die für die Außenwelt nicht sichtbar sind, aber intern verwendet werden (und vom Programmierer jederzeit verbessert werden können, ohne die Sicht des Benutzers auf das Objekt von außen zu ändern das übliche Beispiel, das folgt, stellen Sie sich engine als unsichtbaren internen Arbeiter der Klasse vor.

ruby> class Test
    |   def times_two(a)
    |     print a," times two is ",engine(a),"\n"
    |   end
    |   def engine(b)
    |     b*2
    |   end
    |   private:engine  # this hides engine from users
    | end
   Test
ruby> test = Test.new
   #<Test:0x4017181c>
ruby> test.engine(6)
ERR: (eval):1: private method `engine' called for #<Test:0x4017181c>
ruby> test.times_two(6)
6 times two is 12.
   nil

Wir könnten erwarten, dass * test.engine (6) * ausgeführt wird, um 12 zurückzugeben, aber stattdessen sehen wir, dass * engine * nicht verfügbar ist, wenn der Benutzer sie auf eine Instanz der Klasse * Test * anwendet. Nur andere Methoden der Klasse Test , wie times_two , dürfen engien verwenden. Wir müssen die öffentliche Schnittstelle verwenden, die in der Methode * times \ _two enthalten ist * Der für diese Klasse verantwortliche Programmierer kann * engine * ändern (hier ist es möglich, von * b * 2 * zu * b + b . zu wechseln * um die Leistung zu verbessern) ohne zu berühren, wie der Benutzer mit den * Testobjekten interagiert * Dieses Beispiel ist natürlich sehr einfach, um nützlich zu sein; Die Vorteile der Zugangskontrolle werden erst deutlicher, wenn wir beginnen, komplexere und interessantere Klassen zu erstellen.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken