✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

Abstrakte Klassen, Teil 2 – Abstrakte Klassen und Schnittstellen

21

Im vorherigen Beitrag dieser Serie habe ich Folgendes durchgegangen:

  • die Grundlagen abstrakter Klassen,
  • wie man sie umsetzt,
  • und bereitgestellte funktionierende Codebeispiele.

Und obwohl ich denke, dass das Verständnis abstrakter Klassen der Schlüssel ist, um eine solide Grundlage für die objektorientierte Programmierung zu schaffen, sehe ich oft, dass es verwirrend sein kann, wenn es darum geht, sie mit Schnittstellen zu vergleichen und zu wissen, wann man sie verwendet.

Abstrakte Klassen und Schnittstellen

Also werde ich in diesem Beitrag teilen:

  • eine kurze Auffrischung darüber, was Schnittstellen sind,
  • was abstrakte Klassen sind,
  • und dann, wie man weiß, wann man einen über dem anderen verwendet.

Dies sollte kein programmierintensiver Artikel sein, aber er sollte Ihnen helfen, zu wissen, wann Sie Code eines bestimmten Typs schreiben müssen, um Ihre Projekte besser zu organisieren.

1 Schnittstellen

Denken Sie daran, dass wir bei Schnittstellen auch den Begriff „Programmierung an einer Schnittstelle“ verwenden, mit der Idee, dass die Schnittstelle die Methoden definiert, die eine Klasse implementieren muss, um den „Vertrag“ mit dieser Schnittstelle zu erfüllen.

Der Code, der verwendet wurde, um eine grundlegende Schnittstelle zu demonstrieren, war:

<?php

interface iCache 
{
  public function set($key, $value);
  public function get($key);
  public function has($key);
}

Denken Sie jedoch daran, dass der Zweck der Schnittstelle nicht darin besteht, zu definieren, nachdem der Code geschrieben wurde. Stattdessen ist es ein Werkzeug, das verwendet wird, um zu entwerfen, welche Klassen implementiert werden sollten, wenn sie einem bestimmten Paradigma folgen oder einen bestimmten Satz von Funktionen benötigen.

Das heißt, wenn Sie eine Reihe von Klassen entwerfen, die mit Caching arbeiten, schreiben Sie nicht zuerst die Klassen. Sie schreiben zuerst die Schnittstelle, und dann implementieren die Klassen diese Schnittstelle.

Die Idee ist, dass jede Klasse, die die Schnittstelle implementiert, diese Funktionen garantiert hat.

2 abstrakte Klassen

Abstrakte Klassen hingegen erlauben uns, zwei Dinge zu tun:

  1. Funktionalität implementieren, die von Unterklassen verwendet werden kann,
  2. Methodensignaturen implementieren, die Unterklassen implementieren müssen.

Das mag sich zunächst etwas unpassend anhören, aber bedenken Sie Folgendes:

Wenn Sie eine Klasse eines bestimmten Typs haben, die unabhängig von der Unterklasse eine konsistente Funktionalität hat, geht die Funktionalität in die abstrakte Klasse. Wenn andere Methoden ihre Implementierung einer Methode benötigen, geben Sie einfach die Methodensignatur an und markieren sie als abstract.

Hier ist ein Beispiel aus einem früheren Beitrag:

Nun, das bringt uns alle zu den vorherigen Beispielen und den vorherigen Dingen, auf die wir uns in Bezug auf Schnittstellen und abstrakte Klassen konzentrieren müssen, aber für einige bietet dies immer noch nicht viel Klarheit.

Insbesondere beantwortet dies immer noch nicht die Frage: Wie entscheiden wir, wann wir eine abstrakte Klasse und wann eine Schnittstelle verwenden?

Oberflächlich betrachtet mag es etwas verwirrend klingen, aber es gibt ein paar Dinge, die Ihnen helfen können, die Entscheidung zu treffen.

Wann verwenden wir sie?

Denken Sie daran, dass wir die objektorientierte Programmierung in drei verschiedene Arten unterteilen können:

  • Klassen repräsentieren ein Ding. Sie können diese als Substantiv betrachten.
  • Attribute oder Eigenschaften sind wie Adjektive. Sie beschreiben das Objekt oder etwas, das das Objekt enthalten kann.
  • Methoden oder Funktionen sind wie Verben. Sie beschreiben, was ihr Objekt tun kann.

Wenn es nun um eine Schnittstelle geht, denken Sie darüber nach, was die Schnittstelle tut: Sie beschreibt ohne Implementierung, was ein Objekt tun kann. Und wenn es um eine abstrakte Klasse geht, beschreibt sie, was ein Objekt zur Laufzeit ist.

Mit anderen Worten, eine gute Faustregel lautet: Wenn Sie eine Reihe von Verhaltensweisen für ein Objekt bereitstellen müssen, ist eine Schnittstelle eine gute Wahl. Wenn Sie beschreiben müssen, was ein Objekt ist, verwenden Sie eine abstrakte Klasse.

Für abstrakte Klassen würde ich noch einen Schritt weiter gehen und sagen, dass es hilfreich ist, eine Basisebene von Daten zu beschreiben, die ein Objekt beschreiben oder was es zusätzlich zu einer Basisebene von Funktionalität speichern könnte.

Haben Sie ein Beispiel?

Wie bei den meisten Inhalten in jedem dieser Posts versuche ich, Beispiele zu geben, auch wenn dies nicht speziell im Code erfolgt. Vielleicht hilft das zur weiteren Erklärung:

  • Schnittstellen haben keine Implementierung. Sie garantieren nur, was eine Klasse tun wird.
  • Abstrakte Klassen sollten eine grundlegende Implementierungsebene haben. Dies sollte darstellen, was eine Klasse halten und tun kann, aber nicht vollständig ist. Sie erfordern etwas mehr Implementierung von der Unterklasse.

Wenn Sie mit objektorientiertem Code arbeiten, hoffe ich, dass dies hilft, einige Richtlinien zu geben, wann Sie was verwenden sollten. Wenn nicht, zögern Sie nicht, einen Kommentar zu hinterlassen (etwas, wozu Mitglieder die Erlaubnis haben :).

Darüber hinaus werden wir dies in der Praxis sehen, wenn wir objektorientierten Code schreiben (vor allem für WordPress, aber nicht immer).

Aufnahmequelle: tommcfarlin.com

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen