Entwerfen und Verwenden von Klassen
In objektorientierter Programmierung (OOP) sind Klassen die Bausteine einer Anwendung. Das Verständnis der Beziehung zwischen Klassen und Objekten ist unerlässlich.
- Klassen sind die Blaupausen, die Entwickler zum Definieren der Eigenschaften (Daten) und Methoden (Verhalten) von Objekten verwenden. Klassen bieten eine Möglichkeit zum Kapseln von Daten und Verhalten, wodurch das Organisieren und Verwalten von Code vereinfacht wird.
- Objekte sind Instanzen von Klassen. Wenn eine Klasse instanziiert wird, wird ein Objekt im Arbeitsspeicher erstellt. Jedes Objekt verfügt über einen eigenen Satz von Eigenschaften und Methoden, teilt jedoch dieselbe Struktur, die von der Klasse definiert wird.
Wenn Sie die realen Objekte untersuchen, können Sie verstehen, wie Klassen und Objekte in der Programmierung funktionieren. Objekte in der realen Welt verfügen über Attribute (Eigenschaften) und Verhaltensweisen (Methoden), die ihren Zweck und ihre Funktionalität definieren. Ein Auto ist z. B. ein Objekt mit Attributen wie "Make", "Model" und "Color" und "Verhalten", z. B. "Fahren und Anhalten".
Reale Objekte
Menschen interagieren ständig in ihrem täglichen Leben mit Objekten. Tatsächlich kann fast alles, mit dem wir interagieren, als Objekt betrachtet werden.
Die folgenden Kriterien können verwendet werden, um Objekte in der realen Welt zu definieren:
- Objekte sind die Dinge, die wir sehen und berühren können.
- Objekte haben einen Zweck.
- Objekte weisen Teile auf, die ihren Zweck unterstützen.
Ein Bleistift ist ein Beispiel für ein physisches Objekt. Der Zweck eines Bleistifts besteht darin, eine Notiz oder eine Zeichnung zu erstellen. Die Teile eines Bleistifts enthalten den Textkörper, die Spitze und vielleicht einen Radierer. Die Teile arbeiten zusammen, um den beabsichtigten Zweck des Bleistifts zu erreichen.
Es gibt auch physische Objekte, die als Assembly anderer Objekte vorhanden sind. Die folgende Liste enthält Beispiele für Objekte, die aus anderen Objekten bestehen:
- Ein Auto: Der Zweck eines Autos ist die Bereitstellung des Bodentransports für Einzelpersonen und Familien. Die Teile eines Autos umfassen einen Motor, die Räder, ein Lenkrad und viele andere. Die Teile eines Autos arbeiten zusammen, um den Bodentransport zu ermöglichen.
- Ein Haus: Der Zweck eines Hauses ist es, Schutz zu bieten. Die Teile eines Hauses umfassen eine Stiftung, Außenwände, ein Dach und Räume. Diese Teile arbeiten zusammen, um einen Lebensraum zu schaffen.
- Ein Smartphone: Der Zweck eines Smartphones ist es, den Benutzer bei täglichen Aufgaben und Aktivitäten zu unterstützen. Die Teile eines Smartphones umfassen einen Bildschirm, einen Mikroprozessor, Arbeitsspeicher und Speicher, einen Akku, Kameras und Tasten. Diese Teile arbeiten zusammen, um Kommunikations-, Unterhaltungs- und Produktivitätsfeatures zu ermöglichen.
Jeder Teil eines Autos, Hauses oder Smartphones ist ein Objekt mit eigenem Zweck und kann auch eine Montage von Objekten sein.
Attribute und Features eines physischen Objekts
Nehmen Sie sich eine Minute Zeit, um das Beispiel eines Bleistifts zu berücksichtigen. Ein Bleistift enthält Teile (Textkörper, Spitze, Radierer) und einen Zweck (Erstellen einer Notiz oder Zeichnung). Bleistifte teilen diese grundlegenden Merkmale. Nicht alle Bleistifte sind jedoch identisch.
Einige Bleistifte sind kurz, einige sind lang. Einige Bleistifte sind gelb, einige sind schwarz. Einige Bleistifte haben eine langweilige Spitze, einige haben eine geschärfte Spitze. Einige Bleistifte haben einen Radierer, einige haben keinen Radierer.
Die Attribute eines Objekts werden häufig in die folgenden physischen und Verhaltenskategorien unterteilt:
- Physisch: Physische Attribute sind die Aspekte eines Objekts, das sichtbar oder gemessen werden kann.
- Verhaltensverhalten: Verhaltensattribute sind die Aspekte eines Objekts, das seine Funktionen oder Interaktionen mit anderen Objekten beschreibt.
Für das Bleistiftbeispiel umfassen physische Attribute die Länge des Texts, die Farbe des Texts, die Schärfe der Spitze und ob der Bleistift einen Radierer hat. Zu den Verhaltensattributen gehören die Fähigkeit zum Schreiben, die Fähigkeit zum Löschen und die Fähigkeit, schärfen zu können. Ein Bleistift interagiert mit Papier oder anderen einfarbigen Objekten, auf die geschrieben oder gezeichnet werden kann.
Physische Attribute werden häufig als Eigenschaften bezeichnet, während Verhaltensattribute häufig als Funktionen (Methoden in der C#-Programmierung) bezeichnet werden.
Codeklassen und -objekte in der C#-Programmierung
In der C#-Programmierung werden Objekteigenschaften und -methoden durch eine Klasse definiert. Klassen bieten den Blueprint für das, was ein Objekt (eine Instanz der Klasse) tun kann. Der Blueprint für eine Klasse wird als Klassendefinition bezeichnet.
Wenn eine App ausgeführt wird, verwendet der Computer eine Klassendefinition, um Speicher für ein Objekt (eine Instanz der Klasse) zuzuweisen. Der Computer verwendet den Blueprint, um einen Speicherblock zu konfigurieren, der die richtige Größe für das Objekt darstellt. Ein Objekt ist im Grunde ein Speicherblock.
Codeobjekte, genau wie physische Objekte, können ihren Eigenschaften unterschiedliche Werte zugewiesen haben.
Klassen kapseln Daten und Verhalten
Klassen bieten eine Möglichkeit zum Kapseln von Daten und Verhalten. Kapselung ist der Prozess der Kombination von Daten und Verhalten in einer einzelnen Einheit. Klassen verwenden Eigenschaften, um den Zugriff auf Daten und Methoden zu ermöglichen, um Verhaltensweisen zu ermöglichen.
Klasseneigenschaften
Klasseneigenschaften werden verwendet, um die Daten zu verwalten, die ein Objekt (Klasseninstanz) von einem anderen Objekt desselben Typs unterscheiden.
Klasseneigenschaften ermöglichen Objekten das Lesen, Schreiben oder Berechnen des Werts von Variablen (Datenfeldern), die in der Klasse definiert sind. Eigenschaften werden als öffentliche Datenmmber angezeigt, aber sie werden als spezielle Methoden implementiert, die Accessoren. Mit diesem Feature können Anrufer einfach auf Daten zugreifen und gleichzeitig die Datensicherheit und Flexibilität fördern.
Eigenschaftswerte können mithilfe eines get Accessors gelesen und mithilfe eines set Accessors zugewiesen werden.
Klassenmethoden
Klassenmethoden definieren die Aktionen (Verhaltensweisen), die eine Klasse ausführen kann.
Methoden können Parameter verwenden, die Eingabedaten bereitstellen und Ausgabedaten über Parameter zurückgeben können. Methoden können auch einen Wert direkt zurückgeben, ohne einen Parameter zu verwenden.
Die Console Klasse enthält z. B. WriteLine, ReadLineund Clear Methoden (unter anderem). Diese Methoden helfen, die beabsichtigten Verhaltensweisen der Console Klasse zu ermöglichen. Methoden können verwendet werden, um Aktionen auszuführen, z. B. Berechnungen, Datenbearbeitung oder Interaktion mit anderen Objekten.
Methoden sind häufig so konzipiert, dass sie ein oder mehrere Methodenargumente akzeptieren. Methodenargumente werden als Parameter der aufrufenden Anweisung, die zum Aufrufen der Methode verwendet wird, an die Methode übergeben. Die WriteLine-Methode der Console Klasse kann z. B. ein Zeichenfolgenargument akzeptieren, das von der aufrufenden Anweisung bereitgestellt wird.
Klassendefinitionen im C#-Code
Das folgende Beispiel zeigt eine einfache Klasse in C#. Die Phone-Klasse verfügt über Eigenschaften für Brand, Modelund Year. Die Klasse enthält auch Methoden für Call und Text.
public class Phone
{
public string? Brand { get; set; }
public string? Model { get; set; }
public int Year { get; set; }
public void Call(string phoneNumber)
{
Console.WriteLine($"Calling {phoneNumber}...");
}
public void Text(string phoneNumber, string message)
{
Console.WriteLine($"Texting {phoneNumber}: {message}");
}
}
Verwenden von Namespaces
In der C#-Programmierung werden Namespaces auf zwei Arten verwendet:
- Die .NET-Klassenbibliothek verwendet Namespaces, um die vielen Klassen zu organisieren.
- Entwickler deklarieren ihre eigenen Namespaces, um den Umfang von Klassen- und Methodennamen in größeren Programmierprojekten zu steuern.
Namespaces in der .NET-Klassenbibliothek
Namespaces werden von der .NET-Klassenbibliothek verwendet, um verwandte Typen zu gruppieren, wodurch sie einfacher zu finden und zu verwenden sind.
Betrachten Sie den folgenden Codeausschnitt:
System.Console.WriteLine("Hello World!");
In diesem Beispiel ist System ein Namespace und Console eine Klasse in diesem Namespace.
Durch die Angabe des vollqualifizierten Namens der Klasse (System.Console) wird sichergestellt, dass die richtige Klasse verwendet wird. Die Verwendung vollqualifizierter Namen kann jedoch mühsam sein, wenn Sie mit vielen Klassen aus demselben Namespace arbeiten. Um die Lesbarkeit von Code zu verbessern, können Sie die using-Direktive verwenden. Mit der using-Direktive können Sie typen verwenden, die in einem Namespace definiert sind, ohne den vollqualifizierten Namespace dieses Typs anzugeben.
Der folgende Codeausschnitt implementiert die using-Direktive, um die Lesbarkeit von Code zu verbessern:
using System;
Console.WriteLine("Hello World!");
Anmerkung
Ab .NET 6 werden implizitenglobal using Direktiven neuen C#-Projekten hinzugefügt. Dies bedeutet, dass Sie in diesen Namespaces definierte Typen verwenden können, ohne den vollqualifizierten Namen angeben oder eine using-Direktive manuell hinzufügen zu müssen. Der impliziten Aspekt bezieht sich auf die Tatsache, dass die globalen Verwendungsdirektiven zu einer generierten Datei im Obj-Verzeichnis des Projekts hinzugefügt werden. Mit diesem Feature können Sie Console.WriteLine verwenden, ohne using System explizit zu deklarieren, wenn Sie Apps in Version 6.0 oder höher von .NET entwickeln.
Organisieren von Klassen mit Namespaces
Durch das Deklarieren eigener Namespaces können Sie den Umfang der Klassen- und Methodennamen in größeren Programmierprojekten steuern. Verwenden Sie das schlüsselwort namespace, um einen Namespace zu deklarieren.
Betrachten Sie den folgenden Codeausschnitt:
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
}
Der Name des Namespace muss ein gültiger C#-Bezeichnername sein.
Sie können einen Namespace für alle typen deklarieren, die in dieser Datei definiert sind, wie im folgenden Codeausschnitt gezeigt:
namespace SampleNamespace;
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
}
}
Der Vorteil dieser neuen Syntax besteht darin, dass es einfacher ist, horizontalen Platz und geschweifte Klammern zu sparen. Das erleichtert das Lesen des Codes.
Übersicht über Namespaces
Namespaces weisen die folgenden Eigenschaften auf:
- Sie organisieren große Codeprojekte.
- Sie werden durch den Operator
.getrennt. - Die
using-Direktive weicht die Anforderung ab, den Namen des Namespaces für jede Klasse anzugeben. - Der globale Namespace ist der Namespace "root":
global::Systembezieht sich immer auf den .NET System-Namespace.
Die Verwendung von Namespaces zum Gruppieren verwandter Typen erleichtert das Auffinden und Verwenden dieser Typen.