C# Interfaces: Verträge für robuste objektorientierte Programmierung
Was ist ein Interface?
Ein Interface definiert einen Vertrag ("Was" – keine Implementierung). Es enthält nur Deklarationen von Methoden, Properties, Events, Indexern. Die implementierende Klasse liefert das "Wie".
- Interface-Member sind implizit
public(kein Zugriffsmodifizierer erlaubt). - Eine Klasse kann beliebig viele Interfaces implementieren.
- Interfaces können vererbt werden (Interface erbt von Interface).
- Ab C# 8:
default-Implementierungen in Interfaces möglich.
Interface deklarieren
public interface ITransaction
{
void ShowTransaction(); // Methode
double Amount { get; set; } // Property
event EventHandler Completed; // Event
}
Interface implementieren
public class Transaction : ITransaction
{
private string Code, Date;
private double Amount;
public Transaction(string code, string date, double amount)
{
Code = code; Date = date; Amount = amount;
}
public double Amount { get => Amount; set => Amount = value; } // Property
public void ShowTransaction()
{
Console.WriteLine($"Transaction: {Code}, Date: {Date}, Amount: {Amount}");
}
}
Explizite Interface-Implementierung
Wenn eine Klasse mehrere Interfaces mit gleicher Methodensignatur implementiert oder die Member "versteckt" halten will:
interface I1 { void Do(); }
interface I2 { void Do(); }
public class MyClass : I1, I2
{
void I1.Do() { Console.WriteLine("I1.Do"); }
void I2.Do() { Console.WriteLine("I2.Do"); }
public void Do() { Console.WriteLine("Public Do"); }
}
// Nutzung
MyClass obj = new MyClass();
obj.Do(); // Public Do
((I1)obj).Do(); // I1.Do
((I2)obj).Do(); // I2.Do
Interface vs. Abstrakte Klasse
| Merkmal | Interface | Abstrakte Klasse |
|---|---|---|
| Mehrfachimplementierung | Ja (beliebig viele) | Nein (nur eine Basisklasse) |
| Implementierung | Nein (bis C# 8), ab C# 8 default | Ja (kann Code enthalten) |
| Felder | Nein (nur static const) | Ja |
| Konstruktor | Nein | Ja |
| Zugriffsmodifizierer | Implicit public | Beliebig |
Beispiel: Transaktionen
using System;
namespace InterfaceApplication
{
public interface ITransaction
{
void ShowTransaction();
double GetAmount();
}
public class Transaction : ITransaction
{
private string Code, Date;
private double Amount;
public Transaction(string c, string d, double a)
{
Code = c; Date = d; Amount = a;
}
public double GetAmount() => Amount;
public void ShowTransaction()
{
Console.WriteLine($"Transaction: {Code}");
Console.WriteLine($"Date: {Date}");
Console.WriteLine($"Amount: {GetAmount()}");
}
}
class Program
{
static void Main()
{
ITransaction t1 = new Transaction("001", "8/10/2012", 78900);
ITransaction t2 = new Transaction("002", "9/10/2012", 451900);
t1.ShowTransaction();
t2.ShowTransaction();
Console.ReadKey();
}
}
}
C Sprache
- SPICE über die Kommandozeile: Die Bedeutung des „<“-Operators
- C#-Interfaces meistern: Definition, Implementierung und praktische Anwendungsfälle
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java Collection Interface: Kernkonzepte & essenzielle Methoden
- Java NavigableSet Interface meistern: Navigation, Sortierung und praktische Beispiele
- Java Lambda Expressions meistern: Von Grundlagen bis Stream API
- Zuverlässiger kabelloser Einfahrtssensor für lange Einfahrten – Einfache Raspberry Pi Integration
- Java Interfaces verstehen: Definitionen, Verwendung und Best Practices
- C++ Interfaces: Abstrakte Klassen & Pure Virtual Functions
- Java 9 Private Interface Methods: Bessere Kapselung & Code-Wiederverwendung