Genişletme Methodları (Extension Methods)
Genişletme metodları, mevcut kütüphanelere yeni işlevsellik eklemenizi sağlar. Bu metodları, bir IDE'de kod tamamlama özelliğini kullanırken, normal metodlarla birlikte önerilen genişletme metodları da görebilirsiniz.
Başkalarının veya yaygın olarak kullanılan bir kütüphaneyi uyguladığınızda, Kütüphaneyi değiştirmek genellikle pratik veya mümkün olmayabilir. Ancak yine de işlevsellik eklemek isteyebilirsiniz.
Örneğin, bir dizeyi bir tamsayıya çözümleyen aşağıdaki kodu düşünün:
Bu işlevselliğin String
üzerinde olmasını istiyorsanız, şu şekilde kısaltabilir ve araçlarla daha kolay kullanabilirsiniz:
Bu kodu etkinleştirmek için, String
sınıfına bir genişletme içeren bir kütüphaneyi içe aktarabilirsiniz:
Genişletmeler sadece metodları değil, aynı zamanda diğer üyeleri de (getter, setter ve operatörler gibi) tanımlayabilir. Ayrıca, genişletmelerin isimleri olabilir ve bu, bir API çakışması durumunda yardımcı olabilir. İşte, bir genişletme metodunu uygulayan (NumberParsing adlı) bir genişletmeyi içeren string_apis.dart
dosyasını nasıl oluşturabileceğiniz:
string_apis.dart
Sonraki bölümde genişletme metodlarını nasıl kullanacağınızı, ardından genişletme metodlarını nasıl uygulayacağınızı açıklıyoruz.
Genişletme Metodlarını Kullanma (Using Extension Methods)
Tıpkı diğer Dart kodları gibi, genişletme metodları da kütüphaneler içindedir. Genişletme metodunu kullanmanın yolu, ilgili kütüphaneyi içe aktarmaktır ve bunu sıradan bir metod gibi kullanmaktır:
Genellikle genişletme metodlarını kullanmak için bilmeniz gereken tek şey budur. Kodunuzu yazarken genişletme metodlarının statik tiplere (dinamik değil) nasıl bağlı olduğunu ve kütüphane çakışmalarını nasıl çözeceğinizi de bilmek isteyebilirsiniz.
Statik Tipler ve Dinamik (Static Types and Dynamic)
Genişletme metodlarını dinamik türdeki değişkenler üzerinde çağıramazsınız. Örneğin, aşağıdaki kod bir çalışma zamanı hatasına neden olur:
Genişletme metodları, Dart'ın tür çıkarımı ile çalışır. Aşağıdaki kod sorunsuz çalışır çünkü değişken v'nin türü String olarak çıkarılır:
Dinamik türün çalışmamasının nedeni, genişletme metodlarının alıcının statik türüne karşı çözümlendiğidir. Genişletme metodları statik olarak çözümlendiği için, bunlar statik bir fonksiyonu çağırmak kadar hızlıdır.
Daha fazla bilgi için statik tipler ve dinamik konusuna bakmak için Dart tür sistemine göz atın.
API Çakışmaları (API Conflicts)
Eğer bir genişletme üyesi bir arayüzle veya başka bir genişletme üyesiyle çakışıyorsa, birkaç seçeneğiniz vardır.
Bir seçenek, çakışan genişletmeyi nasıl içe aktardığınızı değiştirmektir, show veya hide kullanarak maruz bırakılan API'yi sınırlayabilirsiniz:
Başka bir seçenek, genişletmeyi açıkça uygulamaktır; bu, genişletmenin bir sarma sınıfı gibi göründüğü kodu içerir:
Eğer her iki genişletme de aynı isme sahipse, o zaman bir ön ek kullanarak içe aktarmak gerekebilir:
Bu örnek gösteriyor ki, bir ön ek kullanarak içe aktarırsanız, genişletme metodlarını açıkça çağırmadan da genişletme metodlarını örtük olarak çağırabilirsiniz. Sadece bir genişletmeyi açıkça çağırmak için bir isim çakışmasını önlemek için ön ek kullanmanız gerekir.
Genişletme Metodlarını Uygulama (Implementing Extension Methods)
Bir genişletme oluşturmak için aşağıdaki sözdizimini kullanın:
Örneğin, String sınıfına bir genişletme nasıl uygulayabileceğinizi aşağıda görebilirsiniz:
string_apis.dart
Bir genişletmenin üyeleri metodlar, getter'lar, setter'lar veya operatörler olabilir. Genişletmeler ayrıca statik alanlara ve statik yardımcı metodlara da sahip olabilir. Genişletme dışında statik üyelere erişmek için, bunları sınıf değişkenleri ve metodları gibi adlarıyla çağırın.
İsimsiz Genişletmeler (Unnamed Extension)
Bir genişletme bildirirken, ismi atlayabilirsiniz. İsimsiz genişletmeler, yalnızca tanımlandıkları kütüphanede görünür. İsimleri olmadığı için, açıkça uygulanamazlar ve API çakışmalarını çözemezler.
Not
İsimsiz genişletmenin statik üyelerini, yalnızca genişletme bildirisi içinde kullanabilirsiniz.
Jenerik Genişletmeleri Uygulama (Implementing Generic Extensions)
Genişletmeler, jenerik tür parametrelerine sahip olabilir. Örneğin, yerleşik List<T> türünü bir getter, bir operatör ve bir metod ile genişleten bir kod parçası aşağıdaki gibidir:
Tür T, çağrılan metodların üzerinde çalıştığı listenin statik türüne bağlı olarak bağlanır.
Last updated