Menu
Coddy logo textTech

is ve as Operatörleri

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 60 / 110.

runtimeType size tam türü söylese de, Dart tür denetimi ve tür dönüştürme (casting) için daha pratik olan iki operatör sunar: is ve as.

is operatörü, bir nesnenin belirli bir türde olup olmadığını kontrol eder ve bir boolean döndürür. runtimeType'ın aksine, üst türler için de true döndürür:

class Animal {}
class Dog extends Animal {}

void main() {
  Animal pet = Dog();
  
  print(pet is Dog);     // true
  print(pet is Animal);  // true (Dog bir Animal'dır)
  print(pet is String);  // false
}

Bir if ifadesi içinde is kullandığınızda, Dart türü otomatik olarak yükseltir ve açıkça tür dönüştürme (casting) yapmadan alt sınıf üyelerine erişmenize olanak tanır:

void handleAnimal(Animal animal) {
  if (animal is Dog) {
    // Dart burada animal'ın bir Dog olduğunu bilir
    animal.bark();  // Dog'a özgü metotlar çağrılabilir
  }
}

as operatörü, bir nesneyi açıkça belirli bir türe dönüştürür. Türden emin olduğunuzda bunu kullanın:

Animal pet = Dog();
Dog myDog = pet as Dog;  // Dog türüne dönüştür
myDog.bark();

as konusunda dikkatli ol - tür dönüşümü başarısız olursa bir istisna fırlatır. Bu nedenle is ile tür yükseltmeyi birleştirmek, doğrudan as kullanmaktan genellikle daha güvenlidir. Bir nesnenin belirli bir türde olmadığını kontrol etmek için is! de kullanabilirsin.

challenge icon

Görev

Kolay

Farklı şekil türlerini tanımlamak ve bunlarla çalışmak için is ve as operatörlerini kullanan bir şekil işleme sistemi oluşturalım. Bir şekil hiyerarşisi oluşturacak ve türleri kontrol eden, türe özgü özelliklere güvenli bir şekilde erişen işlevler yazacaksın.

Kodunu iki dosyada düzenleyeceksin:

  • shapes.dart: Şekil hiyerarşini burada tanımla:
    • Shape özelliğine ve bir oluşturucuya sahip bir String name sınıfı. describe() yazdıran bir [name] is a shape yöntemi ekle.
    • Ek olarak Circle özelliğine sahip ve Shape sınıfını genişleten bir double radius sınıfı. getCircleInfo() yazdıran bir Circle with radius: [radius] yöntemi ekle.
    • Ek olarak Rectangle ve Shape özelliklerine sahip ve double width sınıfını genişleten bir double height sınıfı. getRectangleInfo() yazdıran bir Rectangle: [width] x [height] yöntemi ekle.
  • main.dart: Şekiller dosyanı içe aktar ve şu işlemleri yapan bir processShape(Shape shape) işlevi oluştur:
    • Önce şekil üzerinde describe() çağrısı yap
    • Şeklin bir is olup olmadığını kontrol etmek için Circle kullan; öyleyse getCircleInfo() çağrısı yapmak için tür yükseltmeyi kullan
    • Şeklin bir is olup olmadığını kontrol etmek için Rectangle kullan; öyleyse şekli dönüştürmek ve as çağrısı yapmak için getRectangleInfo() operatörünü kullan
    • Şeklin bir is! OLMADIĞINI ve bir Circle OLMADIĞINI kontrol etmek için Rectangle kullan; öyleyse Unknown shape type yazdır
    Ardından main() işlevinde:
    • Circle adlı, yarıçapı 'Round' olan bir 5.0 oluştur ve bunu processShape() işlevine gönder
    • Boş bir satır yazdır
    • Rectangle adlı, genişliği 'Box' ve yüksekliği 4.0 olan bir 3.0 oluştur ve bunu processShape() işlevine gönder
    • Boş bir satır yazdır
    • Shape adlı temel bir 'Mystery' oluştur ve bunu processShape() işlevine gönder

Bu alıştırma her iki yaklaşımı da gösterir: Circle için otomatik tür yükseltmeyle is kullanmak ve Rectangle için açık dönüştürme amacıyla as kullanmak. Ayrıca is! operatörünün belirli hiçbir alt türe uymayan şekilleri tanımlamaya nasıl yardımcı olduğunu da göreceksin.

Beklenen çıktı:

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

Kendin dene

import 'shapes.dart';

// TODO: Şunları yapan bir processShape(Shape shape) fonksiyonu oluşturun:
// 1. Önce şekil üzerinde describe() metodunu çağırır
// 2. Şeklin bir Circle olup olmadığını kontrol etmek için 'is' kullanır - eğer öyleyse, getCircleInfo() metodunu çağırmak için tür yükseltmeyi (type promotion) kullanır
// 3. Şeklin bir Rectangle olup olmadığını kontrol etmek için 'is' kullanır - eğer öyleyse, tür dönüşümü yapmak için 'as' operatörünü kullanır ve getRectangleInfo() metodunu çağırır
// 4. Şeklin bir Circle ve bir Rectangle OLMADIĞINI kontrol etmek için 'is!' kullanır - eğer öyleyse, "Unknown shape type" yazdırır

void main() {
  // TODO: Yarıçapı 5.0 olan 'Round' adında bir Circle oluşturun ve bunu processShape() fonksiyonuna gönderin
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: Genişliği 4.0 ve yüksekliği 3.0 olan 'Box' adında bir Rectangle oluşturun ve bunu processShape() fonksiyonuna gönderin
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: 'Mystery' adında bir temel Shape oluşturun ve bunu processShape() fonksiyonuna gönderin
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Dart derleyicisi