


C#-Lerntagebuch 23 --- Polymorphismus: Operatorüberladung, Methodenüberladung, abstrakte Klassen, virtuelle Methoden
Die Definition von Polymorphismus in C# lautet: Dieselbe Operation wirkt auf Instanzen verschiedener Klassen, verschiedene Klassen interpretieren sie unterschiedlich und erzeugen schließlich unterschiedliche Ausführungsergebnisse. Mit anderen Worten: eine Schnittstelle, mehrere Funktionen.
C# unterstützt zwei Formen von Polymorphismus: Polymorphismus zur Kompilierungszeit, Polymorphismus zur Laufzeit
Polymorphismus zur Kompilierungszeit:
Polymorphismus zur Kompilierungszeit wird durch Überladung erreicht
Methodenüberladung
Sie können mehrere Definitionen desselben Funktionsnamens im selben Bereich haben. Funktionsdefinitionen müssen sich voneinander unterscheiden, entweder durch die Art der Parameter in der Parameterliste oder durch die Anzahl der Parameter. Funktionsdeklarationen, die sich nur im Rückgabetyp unterscheiden, können nicht überladen werden. Schreiben Sie ein Beispiel
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class exchange //定义一个exchange类 {//方法实现交换两参数数据 public void swap(int a, int b) { int temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}",a,b); } public void swap(string a, string b) { string temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}", a, b); } } class program { static void Main(string[] args) { exchange exch = new exchange(); exch.swap(10, 20); //调用 swap(int a,int b)方法 exch.swap("大", "小"); //调用 swap(string a,string b)方法 } } }
Ergebnis:
Operatorüberladung
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class student //定义student类 { private int Chinese; private int Math; public void value(int a, int b) //定义一个赋值的方法,以后学了构造方法就不这么麻烦了 { Chinese = a; Math = b; } public static student operator + (student a, student b) //运算符重载,实现相加功能 { student stu = new student(); stu.Chinese = a.Chinese + b.Chinese; stu.Math = a.Math + b.Math; return stu; } public int getChinese() //获取Chinese 的方法 { return Chinese; } public int getMath() //获取Math 的方法 { return Math; } } class program { static void Main(string[] args) { student a = new student(); student b = new student(); a.value(70,80); b.value(40, 50); student stu = a + b; //70+40, 80+50 Console.WriteLine("a+b Chinese = {0}\na+b Math = {1}", stu.getChinese(), stu.getMath()); } } }
Ergebnis:
Laufzeitpolymorphismus:
Laufzeitpolymorphismus bedeutet, dass erst bei laufendem System entschieden wird, welche Operation basierend auf der tatsächlichen Situation implementiert werden soll. Laufzeitpolymorphismus in C# Wird durch abstrakte Klassen implementiert oder virtuelle Methoden.
Abstrakte Klassen und abstrakte Methoden
In C# können Sie das Schlüsselwort abstract verwenden, um abstrakte Klassen oder abstrakte Methoden zu erstellen. Wenn eine abgeleitete Klasse von der abstrakten Klasse erbt, ist die Implementierung abgeschlossen. Abstrakte Klassen enthalten abstrakte Methoden, die durch abgeleitete Klassen implementiert werden können. Abgeleitete Klassen verfügen über speziellere Funktionen. Abstrakte Klassen können nicht instanziiert werden,
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test {//创建抽象类和抽象方法 abstract class score { public abstract int Add(); } //创建子类 class student : score { private int Chinese = 80; private int Math = 90; public override int Add() //关键字 override 实例方法 { int sum=Chinese+Math; return sum; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 170 } } }
virtuelle Methoden
Virtuelle Methoden werden mit dem Schlüsselwort virtual deklariert. Virtuelle Methoden können in verschiedenen geerbten Klassen unterschiedliche Implementierungen haben. Aufrufe virtueller Methoden erfolgen zur Laufzeit.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class score { protected int Chinese = 80; protected int Math = 90; public virtual int Add() //定义一个虚方法 { int sum = Chinese + Math; return sum; } } //定义子类,实现方法 class student : score { public override int Add() //关键字 override 实例方法,实现相减操作 { int sub = Math - Chinese ; return sub; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 10 } } }
Wir können sehen, dass die tatsächlich zur Laufzeit aufgerufene Methode keine virtuelle Methode ist, sondern die Methode nach der Überschreibungsinstanz
Das Obige ist C# Learning Diary 23---Polymorphism For Weitere Informationen zu Operatorüberladung, Methodenüberladung, abstrakten Klassen und virtuellen Methoden finden Sie auf der chinesischen PHP-Website (www.php.cn) für weitere verwandte Inhalte!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Vererbung und Polymorphismus wirken sich auf die Kopplung von Klassen aus: Vererbung erhöht die Kopplung, da die abgeleitete Klasse von der Basisklasse abhängt. Polymorphismus reduziert die Kopplung, da Objekte über virtuelle Funktionen und Basisklassenzeiger konsistent auf Nachrichten reagieren können. Zu den Best Practices gehören der sparsame Umgang mit der Vererbung, die Definition öffentlicher Schnittstellen, das Vermeiden des Hinzufügens von Datenelementen zu Basisklassen und die Entkopplung von Klassen durch Abhängigkeitsinjektion. Ein praktisches Beispiel, das zeigt, wie Polymorphismus und Abhängigkeitsinjektion verwendet werden, um die Kopplung in einer Bankkontoanwendung zu reduzieren.

Destruktoren sind im C++-Polymorphismus von entscheidender Bedeutung und stellen sicher, dass abgeleitete Klassenobjekte den Speicher ordnungsgemäß bereinigen, wenn sie zerstört werden. Polymorphismus ermöglicht es Objekten unterschiedlichen Typs, auf denselben Methodenaufruf zu reagieren. Der Destruktor wird automatisch aufgerufen, wenn ein Objekt zerstört wird, um seinen Speicher freizugeben. Der abgeleitete Klassendestruktor ruft den Basisklassendestruktor auf, um sicherzustellen, dass der Basisklassenspeicher freigegeben wird.

Vor- und Nachteile des C++-Polymorphismus: Vorteile: Wiederverwendbarkeit des Codes: Gemeinsamer Code kann verschiedene Objekttypen verarbeiten. Erweiterbarkeit: Fügen Sie ganz einfach neue Klassen hinzu, ohne den vorhandenen Code zu ändern. Flexibilität und Wartbarkeit: Die Trennung von Verhalten und Typ verbessert die Flexibilität des Codes. Nachteile: Laufzeit-Overhead: Der Versand virtueller Funktionen führt zu einem erhöhten Overhead. Codekomplexität: Mehrere Vererbungshierarchien erhöhen die Komplexität. Binärgröße: Die Verwendung virtueller Funktionen erhöht die Größe der Binärdatei. Praktischer Fall: In der Tierklassenhierarchie ermöglicht Polymorphismus, dass verschiedene Tierobjekte durch Tierzeiger Geräusche erzeugen.

Schnittstelle: Eine implementierte Vertragsschnittstelle definiert eine Reihe von Methodensignaturen in Java, stellt jedoch keine konkrete Implementierung bereit. Es fungiert als Vertrag, der Klassen, die die Schnittstelle implementieren, dazu zwingt, ihre angegebenen Methoden zu implementieren. Die Methoden in der Schnittstelle sind abstrakte Methoden und haben keinen Methodenkörper. Codebeispiel: publicinterfaceAnimal{voideat();voidsleep();} Abstrakte Klasse: Teilweise implementierter Entwurf Eine abstrakte Klasse ist eine übergeordnete Klasse, die eine teilweise Implementierung bereitstellt, die von ihren Unterklassen geerbt werden kann. Im Gegensatz zu Schnittstellen können abstrakte Klassen konkrete Implementierungen und abstrakte Methoden enthalten. Abstrakte Methoden werden mit dem Schlüsselwort abstract deklariert und müssen von Unterklassen überschrieben werden. Codebeispiel: publicabstractcla

Funktionsüberladung kann verwendet werden, um Polymorphismus zu erreichen, wobei eine abgeleitete Klassenmethode über einen Basisklassenzeiger aufgerufen wird und der Compiler die überladene Version basierend auf den tatsächlichen Parametertypen auswählt. Im Beispiel definiert die Animal-Klasse eine virtuelle makeSound()-Funktion, und die Dog- und Cat-Klassen schreiben diese Funktion neu. Wenn makeSound() über den Animal*-Zeiger aufgerufen wird, ruft der Compiler die entsprechende überschriebene Version basierend auf dem gezeigten Objekt auf Typ, wodurch Polymorphismus erreicht wird.

Beim Polymorphismus gibt der Rückgabewerttyp der Funktion den spezifischen Objekttyp an, der zurückgegeben wird, wenn eine abgeleitete Klasse eine Basisklassenmethode überschreibt. Der Rückgabewerttyp einer abgeleiteten Klassenmethode kann mit dem der Basisklasse identisch oder spezifischer sein, wodurch mehr abgeleitete Typen zurückgegeben werden können und dadurch die Flexibilität erhöht wird.

Polymorphismus ist ein Konzept in der objektorientierten Programmierung, das die Existenz von Objekten in mehreren Formen ermöglicht und so den Code flexibler, skalierbarer und wartbarer macht. Polymorphismus in C++ nutzt virtuelle Funktionen und Vererbung sowie rein virtuelle Funktionen und abstrakte Klassen, um dynamische Bindungen zu implementieren, sodass wir Klassenhierarchien erstellen können, die das Verhalten basierend auf dem tatsächlichen Typ des Objekts ändern. In der Praxis ermöglicht uns der Polymorphismus, Basisklassenzeiger auf verschiedene abgeleitete Klassenobjekte zu erstellen und die entsprechenden Funktionen basierend auf dem tatsächlichen Typ des Objekts aufzurufen.

Funktionsumschreiben und Vererbungspolymorphismus sind zwei Schlüsselkonzepte in OOP, um einen flexiblen Objektaufruf zu erreichen: Funktionsumschreiben: Die abgeleitete Klasse definiert die gleichnamige Funktion in der Basisklasse neu und führt beim Aufruf die spezifische Implementierung in der abgeleiteten Klasse aus. Polymorphismus der Vererbung: Eine abgeleitete Klasse kann auf die gleiche Weise wie eine Basisklasse verwendet werden. Wenn eine Methode über eine Basisklassenreferenz aufgerufen wird, wird ihre Implementierung in der abgeleiteten Klasse ausgeführt.
