Menu
Coddy logo textTech

Die Operatoren is & as

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 60 von 110.

Während runtimeType dir den exakten Typ mitteilt, stellt Dart zwei Operatoren bereit, die für die Typprüfung und Typumwandlung praktischer sind: is und as.

Der is-Operator prüft, ob ein Objekt von einem bestimmten Typ ist, und gibt einen booleschen Wert zurück. Im Gegensatz zu runtimeType gibt er auch für übergeordnete Typen true zurück:

class Animal {}
class Dog extends Animal {}

void main() {
  Animal pet = Dog();
  
  print(pet is Dog);     // true
  print(pet is Animal);  // true (Dog IST ein Animal)
  print(pet is String);  // false
}

Wenn du is innerhalb einer if-Anweisung verwendest, stuft Dart den Typ automatisch höher ein, sodass du ohne explizite Typumwandlung auf Member der Unterklasse zugreifen kannst:

void handleAnimal(Animal animal) {
  if (animal is Dog) {
    // Dart weiß, dass animal hier ein Dog ist
    animal.bark();  // Kann Dog-spezifische Methoden aufrufen
  }
}

Der as-Operator wandelt ein Objekt explizit in einen bestimmten Typ um. Verwenden Sie ihn, wenn Sie sich über den Typ sicher sind:

Animal pet = Dog();
Dog myDog = pet as Dog;  // Umwandlung in Dog
myDog.bark();

Sei vorsichtig mit as – wenn die Typumwandlung fehlschlägt, wird eine Ausnahme ausgelöst. Deshalb ist die Kombination von is mit Typ-Promotion oft sicherer, als as direkt zu verwenden. Du kannst auch is! verwenden, um zu prüfen, ob ein Objekt nicht von einem bestimmten Typ ist.

challenge icon

Aufgabe

Einfach

Lass uns ein System zur Verarbeitung von Formen erstellen, das die Operatoren is und as verwendet, um verschiedene Formtypen zu identifizieren und mit ihnen zu arbeiten. Du erstellst eine Hierarchie von Formen und schreibst Funktionen, die Typen überprüfen und sicher auf typspezifische Eigenschaften zugreifen.

Du organisierst deinen Code in zwei Dateien:

  • shapes.dart: Definiere hier deine Formen-Hierarchie:
    • Eine Shape-Klasse mit einer String name-Eigenschaft und einem Konstruktor. Füge eine Methode describe() hinzu, die [name] is a shape ausgibt
    • Eine Circle-Klasse, die Shape erweitert und zusätzlich über eine double radius-Eigenschaft verfügt. Füge eine Methode getCircleInfo() hinzu, die Circle with radius: [radius] ausgibt
    • Eine Rectangle-Klasse, die Shape erweitert und zusätzlich über die Eigenschaften double width und double height verfügt. Füge eine Methode getRectangleInfo() hinzu, die Rectangle: [width] x [height] ausgibt
  • main.dart: Importiere deine Formendatei und erstelle eine Funktion processShape(Shape shape), die:
    • Zuerst describe() für die Form aufruft
    • is verwendet, um zu überprüfen, ob die Form ein Circle ist – falls ja, verwende die Typ-Promotion, um getCircleInfo() aufzurufen
    • is verwendet, um zu überprüfen, ob die Form ein Rectangle ist – falls ja, verwende den Operator as, um sie umzuwandeln, und rufe getRectangleInfo() auf
    • is! verwendet, um zu überprüfen, ob die Form KEIN Circle und KEIN Rectangle ist – falls ja, gib Unknown shape type aus
    Führe dann in deiner main()-Funktion Folgendes aus:
    • Erstelle einen Circle namens 'Round' mit dem Radius 5.0 und übergib ihn an processShape()
    • Gib eine leere Zeile aus
    • Erstelle ein Rectangle namens 'Box' mit der Breite 4.0 und der Höhe 3.0 und übergib es an processShape()
    • Gib eine leere Zeile aus
    • Erstelle eine grundlegende Shape namens 'Mystery' und übergib sie an processShape()

Diese Aufgabe demonstriert beide Ansätze: die Verwendung von is mit automatischer Typ-Promotion für den Circle und die Verwendung von as für eine explizite Typumwandlung beim Rectangle. Du wirst außerdem sehen, wie is! dabei hilft, Formen zu identifizieren, die keinem bestimmten Untertyp entsprechen.

Erwartete Ausgabe:

Round is a shape
Circle with radius: 5.0

Box is a shape
Rectangle: 4.0 x 3.0

Mystery is a shape
Unknown shape type

Probier es selbst

import 'shapes.dart';

// TODO: Erstelle eine Funktion processShape(Shape shape), die:
// 1. Zuerst describe() für das shape aufruft
// 2. 'is' verwendet, um zu prüfen, ob shape ein Circle ist – falls ja, verwende Type Promotion, um getCircleInfo() aufzurufen
// 3. 'is' verwendet, um zu prüfen, ob shape ein Rectangle ist – falls ja, verwende den 'as'-Operator für einen Cast und rufe getRectangleInfo() auf
// 4. 'is!' verwendet, um zu prüfen, ob shape KEIN Circle und KEIN Rectangle ist – falls ja, gib "Unknown shape type" aus

void main() {
  // TODO: Erstelle einen Circle namens 'Round' mit dem Radius 5.0 und übergib ihn an processShape()
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Erstelle ein Rectangle namens 'Box' mit der Breite 4.0 und der Höhe 3.0 und übergib es an processShape()
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Erstelle ein Basis-Shape namens 'Mystery' und übergib es an processShape()
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler