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 kullanırken dikkatli olun - eğer tür dönüştürme başarısız olursa, bir istisna fırlatır. Bu nedenle is operatörünü tür yükseltme (type promotion) ile birleştirmek, doğrudan as kullanmaktan genellikle daha güvenlidir. Bir nesnenin belirli bir türde olmadığını kontrol etmek için is! operatörünü de kullanabilirsiniz.

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 ve türe özgü özelliklere güvenli bir şekilde erişen fonksiyonlar yazacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • shapes.dart: Şekil hiyerarşinizi burada tanımlayın:
    • Bir String name özelliğine ve bir yapıcıya (constructor) sahip bir Shape sınıfı. [name] is a shape çıktısını veren bir describe() metodu ekleyin.
    • Shape sınıfını genişleten ve ek bir double radius özelliğine sahip bir Circle sınıfı. Circle with radius: [radius] çıktısını veren bir getCircleInfo() metodu ekleyin.
    • Shape sınıfını genişleten ve ek double width ve double height özelliklerine sahip bir Rectangle sınıfı. Rectangle: [width] x [height] çıktısını veren bir getRectangleInfo() metodu ekleyin.
  • main.dart: Şekil dosyanızı içe aktarın ve aşağıdakileri yapan bir processShape(Shape shape) fonksiyonu oluşturun:
    • Önce şekil üzerinde describe() metodunu çağırır.
    • Ş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ın.
    • Şeklin bir Rectangle olup olmadığını kontrol etmek için is kullanır - eğer öyleyse, onu dönüştürmek (cast) ve getRectangleInfo() metodunu çağırmak için as operatörünü kullanın.
    • Şeklin bir Circle OLMADIĞINI ve bir Rectangle OLMADIĞINI kontrol etmek için is! kullanır - eğer öyleyse, Unknown shape type yazdırın.
    Ardından main() fonksiyonunuzda:
    • 5.0 yarıçaplı, 'Round' adında bir Circle oluşturun ve bunu processShape() fonksiyonuna gönderin.
    • Boş bir satır yazdırın.
    • 4.0 genişliğinde ve 3.0 yüksekliğinde, 'Box' adında bir Rectangle oluşturun ve bunu processShape() fonksiyonuna gönderin.
    • Boş bir satır yazdırın.
    • 'Mystery' adında bir temel Shape oluşturun ve bunu processShape() fonksiyonuna gönderin.

Bu meydan okuma her iki yaklaşımı da göstermektedir: Circle için otomatik tür yükseltme ile is kullanmak ve Rectangle için açık dönüştürme (explicit casting) ile as kullanmak. Ayrıca is! operatörünün belirli bir alt tiple eşleşmeyen şekilleri belirlemeye nasıl yardımcı olduğunu göreceksiniz.

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

Kopya kağıdı

is operatörü, bir nesnenin belirli bir türde olup olmadığını kontrol eder ve bir boolean döndürür. Ü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
}

is operatörünü bir if ifadesi içinde kullandığınızda, Dart türü otomatik olarak yükseltir (promote) ve açıkça tür dönüşümü (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:

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

as kullanırken dikkatli olun - eğer dönüşüm başarısız olursa, bir istisna (exception) fırlatır. is operatörünü tür yükseltme ile birleştirmek, genellikle doğrudan as kullanmaktan daha güvenlidir.

Bir nesnenin belirli bir türde olmadığını kontrol etmek için is! kullanın:

if (animal is! Dog) {
  print("Not a dog");
}

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