🍪 Privacy & Transparency

We and our partners use cookies to Store and/or access information on a device. We and our partners use data for Personalised ads and content, ad and content measurement, audience insights and product development. An example of data being processed may be a unique identifier stored in a cookie. Some of our partners may process your data as a part of their legitimate business interest without asking for consent. To view the purposes they believe they have legitimate interest for, or to object to this data processing use the vendor list link below. The consent submitted will only be used for data processing originating from this website. If you would like to change your settings or withdraw consent at any time, the link to do so is in our privacy policy accessible from our home page..

Vendor List | Privacy Policy
Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry PI

Menu
  • Projekte
    • LED’s
    • Servo & Schrittmotoren
    • Sound
    • LCD’s
    • Kommunikation
    • Sicherheit
    • Weekend Project
  • Arduino
    • Tutorials
    • ProMini
      • Anschließen & Programmieren
    • Nano
      • Arduino Nano – Übersicht
    • UNO
      • Übersicht
    • MEGA 2560
      • Übersicht
    • Leonardo
      • Übersicht
    • NodeMCU
      • NodeMCU – “Einer für (fast) Alles!”
    • Lilypad
      • Arduino: Lilypad “Jetzt Geht’s Rund!”
    • WEMOS
      • WEMOS D1 – Arduino UNO kompatibles Board mit ESP8266 Chip
      • WEMOS D1 Mini – Übersicht
      • Wemos D1 mini Shields
    • STM32x
      • STM32F103C8T6 – Übersicht
    • Maker UNO
      • Maker UNO – Überblick und Test
    • ATTiny85
      • Mini Arduino mit ATTiny85 Chip
      • ATtiny85 mit dem Arduino UNO beschreiben
  • Android
  • Über mich
  • DeutschDeutsch
  • EnglishEnglish
Menu

Apache Groovy #9 – objektorientierte Programmierung – Interfaces

Posted on 7. September 202229. April 2023 by Stefan Draeger

In diesem Beitrag stelle ich dir vor, wie du Interfaces in Groovy implementieren und nutzen kannst.

Im ersten Teil zur objektorientierten Programmierung mit Groovy habe ich dir bereits gezeigt, wie du Klassen und abstrakte Klassen erstellen und somit mit Vererbung arbeiten kannst. Hier soll es nun um die Interfaces gehen.

In diesem Beitrag verwende ich die Eclipse IDE welche ich für die Entwicklung von Groovy Skripte erweitert habe, wie du dieses machen kannst, habe ich im Beitrag Einrichten von Eclipse zum Entwickeln in Apache Groovy ausführlich erläutert.

  • Was ist ein Interface?
  • Wie wird ein Interface aufgebaut?
    • ein kleines Beispiel
  • Erweitern des Groovy Interfaces um eine Methode
  • Eine weitere Implementierung
  • Groovy-Interface-Magic

Was ist ein Interface?

Ein Interface definiert eine Art Muster, welchem eine Klasse entsprechen muss, die dieses Interface implementiert. D.h. es werden die Methoden definiert, aber nicht ausprogrammiert. Die eigentliche Bussiness-Logik wird in den Klassen oder Serviceimplementationen geschrieben.

Auf der Seite https://docs.groovy-lang.org/docs/next/html/documentation/#interfaces findest du die offizielle Dokumentation zu den Interfaces in Apache Groovy.

Wie wird ein Interface aufgebaut?

Ein Interface wird eingeleitet mit dem Schlüsselwort „interface“ gefolgt von einem Namen.

interface ReportService

Ein Interface kann weitere Interfaces erweitern, dafür werden diese mit dem Schlüsselwort „extends“ Kommasepariert aufgeführt.

interface ReportService<T> extends Serializable, SQLData 

ein kleines Beispiel

Starten wir mit einem kleinen Beispiel, zunächst wollen wir einen Service schreiben, welcher nur eine Funktion bietet, der Ausgabe einer Zeile auf der Kommandozeile.

interface OutputService {
	def void printlnWithTimestamp(String text)
}

Die Implementation des Services kann dann wiefolgt aussehen:

import java.text.SimpleDateFormat

class OutputServiceImpl implements OutputService{

	@Override
	public void printlnWithTimestamp(String text) {
		SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:SS")
		String datetime = df.format(new Date())
		println("["+datetime+"] "+text)		
	}
}

Wenn wir dieses nun wie folgt initialisieren und aufrufen:

OutputService outputService

outputService = new OutputServiceImpl()
outputService.printlnWithTimestamp("Hallo Welt!")

Dann erhalten wir folgende Ausgabe auf der Kommandozeile / im Terminal der IDE:

Ausgabe einer Servieimplementation in Groovy
Ausgabe einer Servieimplementation in Groovy

Erweitern des Groovy Interfaces um eine Methode

Wenn wir nun das Interface um eine weitere Methode erweitern, dann werden im gleichen Zuge gezwungen diese auch in der Implementierung zu programmieren. Dieses ist ein Vorteil bei Interfaces und auch abstrakten Klassen, denn so zwingt man andere Entwickler sich an das Format zu halten.

Eine weitere Implementierung

Natürlich kann man auch eine weitere Implementierung zu diesem Interface schreiben und aufrufen und so zwischen mehreren Funktionen mit dem gleichen Namen wechseln.

In meinem Fall erstelle ich mir eine weitere Implementation mit dem Zusatz das, dass Datumsformat auf Deutsch und zusätzlich der Benutzername ausgegeben wird.

import java.text.SimpleDateFormat

class OutputServiceImpl2 implements OutputService{

	@Override
	public void printlnWithTimestamp(String text) {
		SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:SS")
		String datetime = df.format(new Date())
		
		String username = System.getProperty("user.name");
		
		println("["+datetime+", "+username+"] "+text)		
		
	}
}

Wenn wir dieses nun initialisieren und ausführen, so erhalten wir nachfolgende Ausgabe:

eine weitere Implementation des Interfaces
eine weitere Implementation des Interfaces

Erkennbar ist, dass wir in der Zeile 2 unser Interface definieren und jeweils in den Zeilen 4 & 7 eine andere Implementation zuweisen. Dieses funktioniert, da wir für unsere Klassen eine Vorlage nutzen und somit mit dieser arbeiten.

Groovy-Interface-Magic

Kommen wir nun zur Groovy Magic mit Interfaces. Wenn wir eine „normale“ Klasse mit den Methoden aus dem Interface implementieren, ohne das Interface selber zu implementieren, dann können wir eine Instanz von dieser Klasse in das Interface umwandeln.

import java.text.SimpleDateFormat

public class OutputClass {
	
	public void printlnWithTimestamp(String text) {
		SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:SS")
		String datetime = df.format(new Date())
		println("["+datetime+"] "+text)
	}

	public void eineWeitereMethode() {
		println("Hier passiert nichts!")
	}
}

Um nun diese Klasse in eine Instanz unseres Interfaces zu verwandeln, benötigen wir den coercion operator, mit diesem können wir diverse Datentypen umwandeln (ähnlich wie ein casting).

OutputClass outputClass = new OutputClass()
service = outputClass as OutputService
assert service instanceof OutputService

Wenn wir dieses nun aufrufen, dann wird keine Fehlermeldung ausgegeben und unsere Klasse verhält sich wie das Interface. Jedoch verlieren wir die Funktion „eineWeitereMethode“, denn diese ist im Interface nicht definiert.

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Kategorien

Tools

  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator
  • Widerstandsrechner
  • Rechner für Strom & Widerstände
  • ASCII Tabelle

Meta

  • Videothek
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Kontakt
  • Cookie-Richtlinie (EU)

Links

Blogverzeichnis Bloggerei.de Blogverzeichnis TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com
©2023 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb