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.
Görev
KolayFarklı ş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 birString namesınıfı.describe()yazdıran bir[name] is a shapeyöntemi ekle.- Ek olarak
Circleözelliğine sahip veShapesınıfını genişleten birdouble radiussınıfı.getCircleInfo()yazdıran birCircle with radius: [radius]yöntemi ekle. - Ek olarak
RectangleveShapeözelliklerine sahip vedouble widthsınıfını genişleten birdouble heightsınıfı.getRectangleInfo()yazdıran birRectangle: [width] x [height]yöntemi ekle.
main.dart: Şekiller dosyanı içe aktar ve şu işlemleri yapan birprocessShape(Shape shape)işlevi oluştur:- Önce şekil üzerinde
describe()çağrısı yap - Şeklin bir
isolup olmadığını kontrol etmek içinCirclekullan; öyleysegetCircleInfo()çağrısı yapmak için tür yükseltmeyi kullan - Şeklin bir
isolup olmadığını kontrol etmek içinRectanglekullan; öyleyse şekli dönüştürmek veasçağrısı yapmak içingetRectangleInfo()operatörünü kullan - Şeklin bir
is!OLMADIĞINI ve birCircleOLMADIĞINI kontrol etmek içinRectanglekullan; öyleyseUnknown shape typeyazdır
main()işlevinde:Circleadlı, yarıçapı'Round'olan bir5.0oluştur ve bunuprocessShape()işlevine gönder- Boş bir satır yazdır
Rectangleadlı, genişliği'Box've yüksekliği4.0olan bir3.0oluştur ve bunuprocessShape()işlevine gönder- Boş bir satır yazdır
Shapeadlı temel bir'Mystery'oluştur ve bunuprocessShape()işlevine gönder
- Önce şekil üzerinde
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 typeKendin 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
}
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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi