Eine Methode in der objektorientierten Programmierung (OOP) ist eine Prozedur , die einem Objekt zugeordnet ist , und in der Regel auch eine Nachricht . Ein Objekt besteht aus Zustandsdaten und Verhalten ; diese bilden eine Schnittstelle , die festlegt, wie das Objekt verwendet werden kann. Eine Methode ist ein vom Benutzer parametrisiertes Verhalten eines Objekts.
Daten werden als Eigenschaften des Objekts und Verhaltensweisen als Methoden dargestellt. Beispielsweise Windowkönnte ein Objekt Methoden wie ` openget` und `get` besitzen close, während sein Zustand (ob es zu einem bestimmten Zeitpunkt geöffnet oder geschlossen ist) eine Eigenschaft wäre.
In der klassenbasierten Programmierung werden Methoden innerhalb einer Klasse definiert , und Objekte sind Instanzen einer bestimmten Klasse. Eine der wichtigsten Funktionen einer Methode ist das Überschreiben von Methoden – derselbe Name (z. B. `method.for` area) kann für verschiedene Klassen verwendet werden. Dadurch können sendende Objekte Verhaltensweisen aufrufen und deren Implementierung an das empfangende Objekt delegieren. Eine Methode in Java legt das Verhalten eines Klassenobjekts fest. Beispielsweise kann ein Objekt eine areaNachricht an ein anderes Objekt senden, und die entsprechende Formel wird aufgerufen, unabhängig davon, ob das empfangende Objekt ein `Integer` Rectangle, Circle`Integer` Triangle, `Integer` usw. ist.
Methoden stellen außerdem die Schnittstelle bereit, über die andere Klassen auf die Eigenschaften eines Objekts zugreifen und diese ändern können; dies wird als Kapselung bezeichnet . Kapselung und Überschreiben sind die beiden Hauptunterscheidungsmerkmale zwischen Methoden und Prozeduraufrufen. [ 1 ]
Überschreiben und Überladen
Methodenüberschreibung und -überladung sind zwei der wichtigsten Unterschiede zwischen Methoden und herkömmlichen Prozedur- oder Funktionsaufrufen. Überschreibung bedeutet, dass eine Unterklasse die Implementierung einer Methode ihrer Oberklasse neu definiert. Beispielsweise findAreakönnte eine Methode einer Shape-Klasse definiert sein [ 2 ]Triangle , wobei jede die entsprechende Formel zur Flächenberechnung definiert. Der Gedanke dahinter ist, Objekte als „Black Boxes“ zu betrachten, sodass Änderungen an den internen Strukturen eines Objekts mit minimalen Auswirkungen auf andere Objekte, die es verwenden, vorgenommen werden können. Dies wird als Kapselung bezeichnet und soll die Wartung und Wiederverwendbarkeit des Codes erleichtern.
Methodenüberladung hingegen bezeichnet die Differenzierung des Codes zur Verarbeitung einer Nachricht anhand der Methodenparameter. Betrachtet man das empfangende Objekt als ersten Parameter einer Methode, so ist das Überschreiben lediglich ein Spezialfall der Überladung, bei dem die Auswahl ausschließlich auf dem ersten Argument basiert.
Zugriffs-, Änderungs- und Managermethoden
Zugriffsmethoden (Accessor-Methoden) dienen zum Lesen der Datenwerte eines Objekts. Änderungsmethoden (Mutator-Methoden) dienen zum Verändern der Daten eines Objekts. Manager-Methoden werden verwendet, um Objekte einer Klasse zu initialisieren und zu zerstören, z. B. Konstruktoren und Destruktoren.
Diese Methoden bieten eine Abstraktionsschicht , die Kapselung und Modularität ermöglicht . Wenn beispielsweise eine Bankkontoklasse eine getBalance()Zugriffsmethode zum Abrufen des aktuellen Kontostands bereitstellt (anstatt direkt auf die Kontostandsdatenfelder zuzugreifen), können spätere Versionen desselben Codes einen komplexeren Mechanismus zum Abrufen des Kontostands implementieren (z. B. einen Datenbankabruf ), ohne dass der abhängige Code geändert werden muss. Die Konzepte der Kapselung und Modularität sind nicht auf die objektorientierte Programmierung beschränkt. Tatsächlich ist der objektorientierte Ansatz in vielerlei Hinsicht lediglich die logische Erweiterung früherer Paradigmen wie abstrakter Datentypen und strukturierter Programmierung . [ 3 ]
Konstruktoren
Ein Konstruktor ist eine Methode, die zu Beginn der Lebensdauer eines Objekts aufgerufen wird, um das Objekt zu erstellen und zu initialisieren. Dieser Vorgang wird als Konstruktion (oder Instanziierung ) bezeichnet. Die Initialisierung kann die Zuweisung von Ressourcen umfassen. Konstruktoren können Parameter haben, geben aber in den meisten Programmiersprachen üblicherweise keine Werte zurück. Siehe das folgende Beispiel in Java:
public class Person { private String name ; private int age ;// Konstruktormethode public Person ( String name , int age ) { this . name = name ; this . age = age ; } }Zerstörer
Ein Destruktor ist eine Methode, die am Ende der Lebensdauer eines Objekts automatisch aufgerufen wird – ein Vorgang, der als Zerstörung bezeichnet wird . In den meisten Programmiersprachen sind bei der Zerstörung weder Argumente noch Rückgabewerte für Destruktormethoden zulässig. Destruktoren können jedoch so implementiert werden, dass sie bei der Objektzerstörung Aufräumarbeiten und andere Aufgaben ausführen.
Finalisten
In Sprachen mit automatischer Speicherbereinigung (Garbage Collection) , wie Java [ 4 ] : 26, 29 , C# [ 5 ] : 208–209 und Python , werden Destruktoren als Finalisierer bezeichnet . Sie haben eine ähnliche Funktion wie Destruktoren, aber aufgrund der Unterschiede zwischen Sprachen mit automatischer Speicherbereinigung und Sprachen mit manueller Speicherverwaltung ist die Reihenfolge ihrer Aufrufe unterschiedlich.
Abstrakte Methoden
Eine abstrakte Methode besitzt nur eine Signatur , aber keinen Implementierungskörper . Sie wird häufig verwendet, um festzulegen, dass eine Unterklasse eine Implementierung der Methode bereitstellen muss, wie in einer abstrakten Klasse . Abstrakte Methoden werden in einigen Programmiersprachen zur Spezifikation von Schnittstellen verwendet. [ 6 ]
Beispiel
![]()
Der folgende Java- Code zeigt eine abstrakte Klasse, die erweitert werden muss:
abstract class Shape { // Signatur der abstrakten Methode abstract int area ( int height , int width ); }Die folgende Unterklasse erweitert die Hauptklasse:
public class Rectangle extends Shape { @Override int area ( int height , int width ) { return height * width ; } }Reabstraktion
Wenn eine Unterklasse eine Implementierung für eine abstrakte Methode bereitstellt, kann eine andere Unterklasse diese Methode wieder abstrahieren. Dies nennt man Reabstraktion .
In der Praxis wird dies selten angewendet.
Beispiel
In C# kann eine virtuelle Methode durch eine abstrakte Methode überschrieben werden. (Dies gilt auch für Java, wo alle nicht-privaten Methoden virtuell sind.)
class IA { public virtual void M () { // ... } }abstract class IB : IA { // erlaubt public override abstract void M (); }Die Standardmethoden von Schnittstellen können auch reabstrahiert werden, sodass Unterklassen sie implementieren müssen. (Dies gilt auch für Java.)
interface IA { void M () { // ... } }interface IB : IA { abstract void IA . M (); }// Fehler: Die Klasse 'C' implementiert nicht 'IA.M'. class C : IB { // ... }Klassenmethoden
Klassenmethoden sind Methoden, die auf einer Klasse und nicht auf einer Instanz aufgerufen werden. Sie werden typischerweise im Rahmen eines Objekt -Metamodells verwendet . Das heißt, für jede im Metamodell definierte Klasse wird eine Instanz des Klassenobjekts erstellt. Metamodellprotokolle ermöglichen das Erstellen und Löschen von Klassen. In diesem Sinne bieten sie dieselbe Funktionalität wie die oben beschriebenen Konstruktoren und Destruktoren. In einigen Sprachen, wie beispielsweise dem Common Lisp Object System (CLOS), erlaubt das Metamodell dem Entwickler jedoch, das Objektmodell zur Laufzeit dynamisch zu verändern: z. B. um neue Klassen zu erstellen, die Klassenhierarchie neu zu definieren, Eigenschaften zu modifizieren usw.
Spezielle Methoden
Spezielle Methoden sind stark sprachspezifisch, und eine Sprache kann keine, einige oder alle der hier definierten speziellen Methoden unterstützen. Der Compiler einer Sprache kann automatisch Standardmethoden generieren, oder Programmierer können optional eigene spezielle Methoden definieren. Die meisten speziellen Methoden können nicht direkt aufgerufen werden; stattdessen generiert der Compiler Code, um sie zum passenden Zeitpunkt aufzurufen.
Statische Methoden
Statische Methoden sind für alle Instanzen einer Klasse relevant, nicht nur für einzelne Instanzen. In diesem Sinne ähneln sie statischen Variablen . Ein Beispiel wäre eine statische Methode, die die Werte aller Variablen jeder Instanz einer Klasse summiert. Beispielsweise Productkönnte eine Klasse eine statische Methode zur Berechnung des Durchschnittspreises aller Produkte besitzen.
Eine statische Methode kann auch dann aufgerufen werden, wenn noch keine Instanzen der Klasse existieren. Statische Methoden werden als „statisch“ bezeichnet, weil sie zur Kompilierzeit anhand der Klasse, auf der sie aufgerufen werden, aufgelöst werden und nicht dynamisch wie Instanzmethoden, die polymorph anhand des Laufzeittyps des Objekts aufgelöst werden.
Beispiele
In Java
In Java ist eine häufig verwendete statische Methode Math.max().
// aufgerufen wie: Math.max ( a , b );// Deklariert wie folgt: public class Math { // ...public static double max ( double a , double b ) { return ( a < b ) ? b : a ; } }Diese statische Methode hat kein zugehöriges Objekt und wird nicht auf einer Instanz ausgeführt. Sie erhält alle Informationen aus ihren Argumenten. [ 2 ]
Kopierzuweisungsoperatoren
Kopierzuweisungsoperatoren definieren Aktionen, die vom Compiler ausgeführt werden, wenn ein Klassenobjekt einem Klassenobjekt desselben Typs zugewiesen wird.
Operatormethoden
Operatormethoden definieren oder überdefinieren Operatorsymbole und legen die Operationen fest, die mit dem Symbol und den zugehörigen Methodenparametern ausgeführt werden sollen. C++-Beispiel:
import std ;using std :: string ;class Person { private : string name ; int age ; public : bool operator < ( const Person & other ) const { return age < other.age ; }bool operator == ( const Person & other ) const { return name == other . name && age == other . age ; } };Memberfunktionen in C++
Einige prozedurale Sprachen wurden um objektorientierte Funktionen erweitert, um die umfangreichen Kenntnisse und den bestehenden Code dieser Sprachen zu nutzen und gleichzeitig die Vorteile der objektorientierten Entwicklung zu erhalten. Das wohl bekannteste Beispiel ist C++ , eine objektorientierte Erweiterung der Programmiersprache C. Aufgrund der Designvorgaben, das objektorientierte Paradigma in eine bestehende prozedurale Sprache zu integrieren, weist die Nachrichtenübermittlung in C++ einige einzigartige Funktionen und Begriffe auf. Beispielsweise wird in C++ eine Methode als Memberfunktion bezeichnet . C++ kennt außerdem das Konzept virtueller Funktionen . Dies sind Memberfunktionen, die in abgeleiteten Klassen überschrieben werden können und dynamische Aufrufe ermöglichen .
Virtuelle Funktionen
Virtuelle Funktionen ermöglichen es einer C++-Klasse, polymorphes Verhalten zu erreichen. Nicht-virtuelle Memberfunktionen oder reguläre Methoden sind solche, die nicht an der Polymorphie teilnehmen .
C++-Beispiel:
#include <iostream> #include <memory>class Super { public : virtual ~ Super () = default ;virtual void IAm () { std :: cout << "Ich bin die Superklasse! \n " ; } };class Sub : public Super { public : void IAm () override { std :: cout << "Ich bin die Unterklasse! \n " ; } };int main ( ) { std :: unique_ptr <Super> inst1 = std :: make_unique <Super> ( ) ; std :: unique_ptr <Super> inst2 = std :: make_unique <Sub> ( ) ;inst1 -> IAm (); // Ruft |Super::IAm| auf. inst2 -> IAm (); // Ruft |Sub::IAm| auf. }Siehe auch
- Eigenschaft (Programmierung)
- Remote-Methodenaufruf
- Unterprogramm , auch Subroutine, Routine, Prozedur oder Funktion genannt
Anmerkungen
- ^ „Was ist ein Objekt?“ . oracle.com . Oracle Corporation . Abgerufen am 13. Dezember 2013 .
- ^ a b Martin, Robert C. (2009). Clean Code: A Handbook of Agile Software Craftsmanship . Prentice Hall. S. 296. ISBN 978-0-13-235088-4Die
- ^ Meyer, Bertrand (1988). Objektorientierte Softwareentwicklung . Cambridge: Prentice Hall International Series in Computer Science. S. 52–54 . ISBN 0-13-629049-3Die
- ^ Bloch, Joshua (2018). „Effective Java: Programming Language Guide“ (dritte Auflage). Addison-Wesley. ISBN 978-0134685991Die
- ^ Albahari, Joseph. C# 10 auf den Punkt gebracht . O'Reilly. ISBN 978-1-098-12195-2Die
- ^ „Abstrakte Methoden und Klassen“ . oracle.com . Oracle Java-Dokumentation . Abgerufen am 11. Dezember 2014 .
Referenzen
- JANA, DEBASISH (1. Januar 2005). C++ und das objektorientierte Programmierparadigma . PHI Learning Pvt. Ltd. ISBN 978-81-203-2871-6Die
- Sengupta, Probal (1. August 2004). Objektorientierte Programmierung: Grundlagen und Anwendungen . PHI Learning Pvt. Ltd. ISBN 978-81-203-1258-6Die
- Svenk, Goran (2003). Objektorientierte Programmierung: C++ für Ingenieurwesen und Technologie . Cengage Learning. ISBN 0-7668-3894-3Die
- Balagurusamy (2013). Objektorientierte Programmierung mit C++ . Tata McGraw-Hill Education. ISBN 978-1-259-02993-6Die
- Kirch-Prinz, Ulla; Prinz, Peter (2002). Ein vollständiger Leitfaden zur Programmierung in C++ . Jones & Bartlett Learning. ISBN 978-0-7637-1817-6Die
- Conger, David (2006). Spieleentwicklung in C++: Eine Schritt-für-Schritt-Anleitung . New Riders. ISBN 978-0-7357-1434-2Die
- Skinner, MT (1992). Das fortgeschrittene C++-Buch . Silicon Press. ISBN 978-0-929306-10-0Die
- Love (1. September 2005). Linux-Kernel-Entwicklung . Pearson Education. ISBN 978-81-7758-910-8Die
- DEHURI, SATCHIDANANDA; JAGADEV, ALOK KUMAR; RATH, AMIYA KUMAR (8. Mai 2007). OBJEKTORIENTIERTE PROGRAMMIERUNG MIT C++ . PHI Learning Pvt. ISBN 978-81-203-3085-6Die