Heim Web-Frontend js-Tutorial Ein tiefer Einblick in Prototypen und Vererbung in JavaScript

Ein tiefer Einblick in Prototypen und Vererbung in JavaScript

Nov 26, 2019 pm 06:11 PM
javascript Prototyp 继承

In diesem Artikel geht es hauptsächlich darum, wie Prototypen in JavaScript funktionieren und wie man Objekteigenschaften und -methoden über das von allen Objekten gemeinsam genutzte versteckte Attribut [Prototyp] verknüpft, wie man benutzerdefinierte Konstruktoren erstellt und wie die prototypische Vererbung funktioniert, um Eigenschaften und Methoden zu übergeben Werte .

Ein tiefer Einblick in Prototypen und Vererbung in JavaScript

Einführung

JavaScript ist eine prototypbasierte Sprache, was bedeutet, dass auf Objekteigenschaften und -methoden zugegriffen werden kann Universelle Objektfreigabe mit Klon- und Erweiterungsfunktionen. Dies wird als prototypische Vererbung bezeichnet und unterscheidet sich von der Klassenvererbung. JavaScript ist unter den beliebten objektorientierten Programmiersprachen relativ einzigartig, da andere bekannte Sprachen wie PHP, Python und Java klassenbasierte Sprachen sind, die Klassen als Blaupausen für Objekte definieren.

[Verwandte Kursempfehlungen: JavaScript-Video-Tutorial]

In dem Artikel erfahren wir, was ein Objektprototyp ist und wie man einen Konstruktor verwendet, um den Prototyp zu erweitern ein neues Objekt. Wir lernen auch etwas über Vererbung und die Prototypenkette.

JavaScript-Prototyp

Jedes Objekt in JavaScript verfügt über eine interne Eigenschaft namens [[Prototyp]]. Wir können dies demonstrieren, indem wir ein neues leeres Objekt erstellen.

let x = {};
Nach dem Login kopieren

So erstellen wir normalerweise Objekte, aber bitte beachten Sie, dass dies auch durch die Verwendung des Objektkonstruktors erreicht werden kann:

let x = new object()
Nach dem Login kopieren

Eckige Klammern um [[Prototyp]] Zeigt an dass es sich um eine interne Eigenschaft handelt und nicht direkt vom Code aus darauf zugegriffen werden kann.

Um den [[Prototyp]] dieses neu erstellten Objekts zu finden, verwenden wir die Methode getPrototypeOf().

Object.getPrototypeOf(x);
Nach dem Login kopieren

Die Ausgabe besteht aus mehreren integrierten Eigenschaften und Methoden.

Ausgabe:

{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, …}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Eine andere Möglichkeit, [[Prototype]] zu finden, ist die __proto__-Eigenschaft. __proto__ ist eine Eigenschaft, die die internen Eigenschaften des [[Prototype]]-Objekts offenlegt.

Es ist wichtig zu beachten, dass _proto__ eine Legacy-Funktion ist und nicht im Produktionscode verwendet werden sollte und nicht in jedem modernen Browser vorhanden ist. Wir können es jedoch in diesem Artikel zu Demonstrationszwecken verwenden.

x.__proto__;
Nach dem Login kopieren

Die Ausgabe ist die gleiche wie bei der Verwendung von getPrototypeOf().

Ausgabe

{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, …}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Es ist wichtig, dass jedes Objekt in JavaScript einen [[Prototyp]] hat, da dadurch verknüpfte Methoden für zwei oder mehr beliebige Objekte erstellt werden.

Die von Ihnen erstellten Objekte haben denselben [[Prototyp]] wie integrierte Objekte wie Datum und Array. Auf diese interne Eigenschaft kann über das Prototyp-Attribut von einem Objekt auf ein anderes verwiesen werden, was wir später im Tutorial sehen werden.

Prototypische Vererbung

Wenn Sie versuchen, auf eine Eigenschaft oder Methode eines Objekts zuzugreifen, sucht JavaScript zunächst nach dem Objekt selbst , wenn nicht gefunden, wird nach dem [[Prototyp]] des Objekts gesucht. Wenn nach der Abfrage des Objekts und seines [[Prototyps]] keine Übereinstimmung gefunden wird, überprüft JavaScript den Prototyp des verknüpften Objekts und setzt die Suche fort, bis es das Ende der Prototypenkette erreicht.

Das Ende der Prototypenkette ist Object.prototype. Alle Objekte erben die Eigenschaften und Methoden von Objekten. Jede Suche über das Ende der Kette hinaus führt zu Null.

In unserem Beispiel ist x ein leeres Objekt, das vom Objekt geerbt wurde. x kann alle Eigenschaften oder Methoden verwenden, die das Objekt hat, wie zum Beispiel toString().

x.toString();
Nach dem Login kopieren

Ausgabe

[object Object]
Nach dem Login kopieren

Diese Prototypkette ist nur eine Kette lang. x - > Objekt. Wir wissen das, denn wenn wir versuchen, zwei [[Prototype]]-Eigenschaften miteinander zu verketten, wird es null sein.

x.__proto__.__proto__;
Nach dem Login kopieren

Ausgabe

null
Nach dem Login kopieren

Sehen wir uns einen anderen Objekttyp an. Wenn Sie Erfahrung mit Arrays in JavaScript haben, wissen Sie, dass diese über viele integrierte Methoden verfügen, wie z. B. pop() und push(). Der Grund dafür, dass beim Erstellen eines neuen Arrays auf diese Methoden zugegriffen werden kann, besteht darin, dass jedes erstellte Array auf die Eigenschaften und Methoden in array.prototype zugreifen kann.

Wir können dies testen, indem wir ein neues Array erstellen.

let y = [];
Nach dem Login kopieren

Denken Sie daran, wir können dies auch als Array-Konstruktor schreiben, sei es y = new array().

Wenn wir uns den [[Prototyp]] des neuen y-Arrays ansehen, werden wir feststellen, dass es mehr Eigenschaften und Methoden als das x-Objekt hat. Es erbt alles von Array.prototype.

y.__proto__;
Nach dem Login kopieren
[constructor: ƒ, concat: ƒ, pop: ƒ, push: ƒ, …]
Nach dem Login kopieren

Sie werden feststellen, dass das Konstruktorattribut des Prototyps auf Array() gesetzt ist. Die Eigenschaft „constructor“ gibt den Konstruktor des Objekts zurück, bei dem es sich um einen Mechanismus zum Konstruieren von Objekten aus Funktionen handelt.

Wir können jetzt zwei Prototypen miteinander verknüpfen, da in diesem Fall unsere Prototypenkette länger ist. Es sieht aus wie y -> Array ->

y.__proto__.__proto__;
Nach dem Login kopieren
rrree

Diese Kette verweist jetzt auf Object.prototype. Wir können den inneren [[Prototype]] anhand des Prototype-Attributs des Konstruktors testen, um sicherzustellen, dass sie sich auf dasselbe beziehen.

{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, …}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Um dies zu erreichen, können wir auch die Methode isPrototypeOf() verwenden.

Array.prototype.isPrototypeOf(y);      // true
Object.prototype.isPrototypeOf(Array); // true
Nach dem Login kopieren

我们可以使用instanceof操作符来测试构造函数的prototype属性是否出现在对象原型链中的任何位置。

y instanceof Array; // true
Nach dem Login kopieren

总而言之,所有JavaScript对象都具有隐藏的内部[[Prototype]]属性(可能__proto__在某些浏览器中公开)。对象可以扩展,并将继承[[Prototype]]其构造函数的属性和方法。

这些原型可以被链接,并且每个额外的对象将继承整个链中的所有内容。链以Object.prototype结束。

构造器函数

构造函数是用来构造新对象的函数。new操作符用于基于构造函数创建新实例。我们已经看到了一些内置的JavaScript构造函数,比如new Array()和new Date(),但是我们也可以创建自己的自定义模板来构建新对象。

例如,我们正在创建一个非常简单的基于文本的角色扮演游戏。用户可以选择一个角色,然后选择他们将拥有的角色类别,例如战士、治疗者、小偷等等。

由于每个字符将共享许多特征,例如具有名称、级别和生命值,因此创建构造函数作为模板是有意义的。然而,由于每个角色类可能有非常不同的能力,我们希望确保每个角色只能访问自己的能力。让我们看看如何使用原型继承和构造函数来实现这一点。

首先,构造函数只是一个普通函数。当使用new关键字的实例调用它时,它将成为一个构造函数。在JavaScript中,我们按照惯例将构造函数的第一个字母大写。

// Initialize a constructor function for a new Hero
function Hero(name, level) {
  this.name = name;  this.level = level;
}
Nach dem Login kopieren

我们创建了一个名为Hero的构造函数,它有两个参数:name和level。因为每个字符都有一个名称和一个级别,所以每个新字符都有这些属性是有意义的。this关键字将引用创建的新实例,因此将this.name设置为name参数将确保新对象具有name属性集。

现在我们可以用new创建一个新的实例。

let hero1 = new Hero('Bjorn', 1);
Nach dem Login kopieren

如果我们在控制台输出hero1,我们将看到已经创建了一个新对象,其中新属性按预期设置。

输出

Hero {name: "Bjorn", level: 1}
Nach dem Login kopieren

现在,如果我们得到hero1的[[Prototype]],我们将能够看到构造函数Hero()。(记住,它的输入与hero1相同。,但这是正确的方法。)

Object.getPrototypeOf(hero1);
Nach dem Login kopieren

输出

constructor: ƒ Hero(name, level)
Nach dem Login kopieren

您可能注意到,我们只在构造函数中定义了属性,而没有定义方法。在JavaScript中,为了提高效率和代码可读性,通常在原型上定义方法。

我们可以使用prototype向Hero添加一个方法。我们将创建一个greet()方法。

// Add greet method to the Hero prototype
Hero.prototype.greet = function () {
  return `${this.name} says hello.`;
}
Nach dem Login kopieren

因为greet()在Hero的原型中,而hero1是Hero的一个实例,所以这个方法对hero1是可用的。

hero1.greet();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

输出

"Bjorn says hello."
Nach dem Login kopieren
Nach dem Login kopieren

如果检查Hero的[[Prototype]],您将看到greet()现在是一个可用选项。

这很好,但是现在我们想要为英雄创建角色类。将每个类的所有功能都放到Hero构造函数中是没有意义的,因为不同的类具有不同的功能。我们希望创建新的构造函数,但也希望它们连接到原始的Hero。

我们可以使用call()方法将属性从一个构造函数复制到另一个构造函数。让我们创建一个战士和一个治疗构造器。

// Initialize Warrior constructor
function Warrior(name, level, weapon) {
  // Chain constructor with call
  Hero.call(this, name, level);  // Add a new property
  this.weapon = weapon;
}// Initialize Healer constructor
function Healer(name, level, spell) {
  Hero.call(this, name, level);  this.spell = spell;
}
Nach dem Login kopieren

两个新的构造函数现在都具有Hero和unqiue的属性。我们将把attack()方法添加到Warrior中,而heal()方法添加到Healer中。

Warrior.prototype.attack = function () {
  return `${this.name} attacks with the ${this.weapon}.`;
}

Healer.prototype.heal = function () {
  return `${this.name} casts ${this.spell}.`;
}
Nach dem Login kopieren

此时,我们将使用两个可用的新字符类创建字符。

const hero1 = new Warrior('Bjorn', 1, 'axe');
const hero2 = new Healer('Kanin', 1, 'cure');
Nach dem Login kopieren

hero1现在被认为是拥有新属性的战士。

输出

Warrior {name: "Bjorn", level: 1, weapon: "axe"}
Nach dem Login kopieren

我们可以使用我们在战士原型上设置的新方法。

hero1.attack();
Nach dem Login kopieren
Console
"Bjorn attacks with the axe."
Nach dem Login kopieren

但是如果我们尝试使用原型链下面的方法会发生什么呢?

hero1.greet();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

输出

Uncaught TypeError: hero1.greet is not a function
Nach dem Login kopieren

使用call()链接构造函数时,原型属性和方法不会自动链接。我们将使用Object.create()来链接原型,确保在创建并添加到原型的任何其他方法之前将其放置。

Warrior.prototype = Object.create(Hero.prototype);
Healer.prototype = Object.create(Hero.prototype);
// All other prototype methods added below…
Nach dem Login kopieren

现在我们可以在一个战士或治疗者的实例上成功地使用Hero的原型方法。

hero1.greet();
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

输出

"Bjorn says hello."
Nach dem Login kopieren
Nach dem Login kopieren

这里是我们的角色创建页面的完整代码。

// Initialize constructor functions
function Hero(name, level) {
  this.name = name;
  this.level = level;
}
 
function Warrior(name, level, weapon) {
  Hero.call(this, name, level);
 
  this.weapon = weapon;
}
 
function Healer(name, level, spell) {
  Hero.call(this, name, level);
 
  this.spell = spell;
}
 
// Link prototypes and add prototype methods
Warrior.prototype = Object.create(Hero.prototype);
Healer.prototype = Object.create(Hero.prototype);
 
Hero.prototype.greet = function () {
  return `${this.name} says hello.`;
}
 
Warrior.prototype.attack = function () {
  return `${this.name} attacks with the ${this.weapon}.`;
}
 
Healer.prototype.heal = function () {
  return `${this.name} casts ${this.spell}.`;
}
 
// Initialize individual character instances
const hero1 = new Warrior('Bjorn', 1, 'axe');
const hero2 = new Healer('Kanin', 1, 'cure');
Nach dem Login kopieren

使用这段代码,我们已经用基本属性创建了Hero类,从原始构造函数创建了两个名为Warrior和Healer的字符类,向原型添加了方法,并创建了单独的字符实例。

Dieser Artikel stammt aus der Kolumne JS-Tutorial, willkommen zum Lernen!

Das obige ist der detaillierte Inhalt vonEin tiefer Einblick in Prototypen und Vererbung in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Detaillierte Erläuterung der C++-Funktionsvererbung: Wie werden „Basisklassenzeiger' und „abgeleitete Klassenzeiger' bei der Vererbung verwendet? Detaillierte Erläuterung der C++-Funktionsvererbung: Wie werden „Basisklassenzeiger' und „abgeleitete Klassenzeiger' bei der Vererbung verwendet? May 01, 2024 pm 10:27 PM

Verwenden Sie bei der Funktionsvererbung „Basisklassenzeiger“ und „abgeleitete Klassenzeiger“, um den Vererbungsmechanismus zu verstehen: Wenn der Basisklassenzeiger auf das abgeleitete Klassenobjekt zeigt, wird eine Aufwärtstransformation durchgeführt und nur auf die Mitglieder der Basisklasse zugegriffen. Wenn ein abgeleiteter Klassenzeiger auf ein Basisklassenobjekt zeigt, wird eine Abwärtsumwandlung durchgeführt (unsicher) und muss mit Vorsicht verwendet werden.

Wie wirken sich Vererbung und Polymorphismus auf die Klassenkopplung in C++ aus? Wie wirken sich Vererbung und Polymorphismus auf die Klassenkopplung in C++ aus? Jun 05, 2024 pm 02:33 PM

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.

Ausführliche Erklärung der C++-Funktionsvererbung: Wie kann man Fehler bei der Vererbung debuggen? Ausführliche Erklärung der C++-Funktionsvererbung: Wie kann man Fehler bei der Vererbung debuggen? May 02, 2024 am 09:54 AM

Tipps zum Debuggen von Vererbungsfehlern: Stellen Sie sicher, dass die Vererbungsbeziehungen korrekt sind. Verwenden Sie den Debugger, um den Code schrittweise durchzugehen und Variablenwerte zu untersuchen. Stellen Sie sicher, dass Sie den virtuellen Modifikator richtig verwenden. Untersuchen Sie das Problem der Vererbungsdiamanten, das durch versteckte Vererbung verursacht wird. Suchen Sie nach nicht implementierten rein virtuellen Funktionen in abstrakten Klassen.

Ausführliche Erklärung der C++-Funktionsvererbung: Wie versteht man die Beziehung „is-a' und „has-a' bei der Vererbung? Ausführliche Erklärung der C++-Funktionsvererbung: Wie versteht man die Beziehung „is-a' und „has-a' bei der Vererbung? May 02, 2024 am 08:18 AM

Detaillierte Erläuterung der C++-Funktionsvererbung: Beherrschen Sie die Beziehung zwischen „is-a“ und „has-a“ Was ist Funktionsvererbung? Funktionsvererbung ist eine Technik in C++, die in einer abgeleiteten Klasse definierte Methoden mit in einer Basisklasse definierten Methoden verknüpft. Es ermöglicht abgeleiteten Klassen, auf Methoden der Basisklasse zuzugreifen und diese zu überschreiben, wodurch die Funktionalität der Basisklasse erweitert wird. „Ist-ein“- und „Hat-ein“-Beziehungen Bei der Funktionsvererbung bedeutet die „Ist-ein“-Beziehung, dass die abgeleitete Klasse ein Untertyp der Basisklasse ist, d. h. die abgeleitete Klasse „erbt“ die Merkmale und das Verhalten von die Basisklasse. Die „has-a“-Beziehung bedeutet, dass die abgeleitete Klasse einen Verweis oder Zeiger auf das Basisklassenobjekt enthält, d. h. die abgeleitete Klasse „besitzt“ das Basisklassenobjekt. SyntaxDas Folgende ist die Syntax für die Implementierung der Funktionsvererbung: classDerivedClass:pu

Genshin Impact Einführung in die neue Karte in Version 4.4 Genshin Impact Einführung in die neue Karte in Version 4.4 Jan 31, 2024 pm 06:36 PM

Mit der Einführung der neuen Karte von Genshin Impact Version 4.4. Freunde, die Version 4.4 von Genshin Impact läutete auch das Sea Lantern Festival in Liyue ein. Gleichzeitig wird in Version 4.4 ein neuer Kartenbereich namens Shen Yu Valley eingeführt. Den bereitgestellten Informationen zufolge ist Shen Yugu tatsächlich Teil des Dorfes Qiaoying, die Spieler sind jedoch eher daran gewöhnt, es Shen Yugu zu nennen. Lassen Sie mich Ihnen nun die neue Karte vorstellen. Einführung in die neue Karte von Genshin Impact Version 4.4. Version 4.4 öffnet „Chenyu Valley·Shanggu“, „Chenyu Valley·Nanling“ und „Laixin Mountain“ im Norden von Liyue Tal·Shanggu" . ※Nach Abschluss des Prologs der Dämonengott-Quest · Akt 3: Der Drache und das Lied der Freiheit wird der Teleportationsankerpunkt automatisch freigeschaltet. 2. Qiaoyingzhuang Als die warme Frühlingsbrise erneut die Berge und Felder von Chenyu streichelte, duftend

„Einführung in die objektorientierte Programmierung in PHP: Vom Konzept zur Praxis' „Einführung in die objektorientierte Programmierung in PHP: Vom Konzept zur Praxis' Feb 25, 2024 pm 09:04 PM

Was ist objektorientierte Programmierung? Objektorientierte Programmierung (OOP) ist ein Programmierparadigma, das reale Entitäten in Klassen abstrahiert und Objekte zur Darstellung dieser Entitäten verwendet. Klassen definieren die Eigenschaften und das Verhalten von Objekten und Objekte instanziieren Klassen. Der Hauptvorteil von OOP besteht darin, dass Code einfacher zu verstehen, zu warten und wiederzuverwenden ist. Grundkonzepte von OOP Zu den Hauptkonzepten von OOP gehören Klassen, Objekte, Eigenschaften und Methoden. Eine Klasse ist der Bauplan eines Objekts, der seine Eigenschaften und sein Verhalten definiert. Ein Objekt ist eine Instanz einer Klasse und verfügt über alle Eigenschaften und Verhaltensweisen der Klasse. Eigenschaften sind Merkmale eines Objekts, das Daten speichern kann. Methoden sind Funktionen eines Objekts, die mit den Daten des Objekts arbeiten können. Vorteile von OOP Zu den Hauptvorteilen von OOP gehören: Wiederverwendbarkeit: OOP kann den Code erweitern

Erläuterung der C++-Funktionsvererbung: Wann sollte die Vererbung nicht verwendet werden? Erläuterung der C++-Funktionsvererbung: Wann sollte die Vererbung nicht verwendet werden? May 04, 2024 pm 12:18 PM

Die Vererbung von C++-Funktionen sollte in den folgenden Situationen nicht verwendet werden: Wenn eine abgeleitete Klasse eine andere Implementierung erfordert, sollte eine neue Funktion mit einer anderen Implementierung erstellt werden. Wenn eine abgeleitete Klasse keine Funktion erfordert, sollte sie als leere Klasse deklariert werden oder private, nicht implementierte Mitgliedsfunktionen der Basisklasse verwenden, um die Funktionsvererbung zu deaktivieren. Wenn Funktionen keine Vererbung erfordern, sollten andere Mechanismen (z. B. Vorlagen) verwendet werden, um eine Wiederverwendung des Codes zu erreichen.

Java-Schnittstellen und abstrakte Klassen: Der Weg zum Programmierhimmel Java-Schnittstellen und abstrakte Klassen: Der Weg zum Programmierhimmel Mar 04, 2024 am 09:13 AM

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

See all articles