Yapılar Arası Dönüşümler
Yapılar Arası Dönüşümler
Temel türler yerine sınıflar veya yapılarla ilgilenen kullanıcı tanımlı dönüştürmeler, dikkate alınması gereken birkaç durum dışında benzer şekilde çalışır. Kullanıcı dönüşümünü kaynak türünde veya hedef türünde tanımlayabildiğiniz için, yapacak biraz daha fazla tasarım işiniz var ve işlem biraz daha karmaşıktır.
Önceki bölümdeki RomanNumeral örneğini temel alarak, bunun gibi ikili sayıları işleyen bir yapı ekleyebilirsiniz. Sınıfları birlikte kullanabilirsiniz, ancak birbirlerini gerçekten tanımadıkları için biraz fazladan yazmanız gerekir. Bir RomanNumeral’dan BinaryNumeral’a dönüştürme, önce bir int’ye dönüştürmeyi gerektirir.
Main() işlevini aşağıdaki gibi yazmak ve türlerin yerleşik türler gibi görünmesini sağlamak güzel olurdu, tek fark RomanNumeral’ın ikiliden daha küçük bir aralığa sahip olması ve bu nedenle bu bölümde açık bir dönüştürme gerektirmesidir.
Bunu elde etmek için RomanNumeral sınıfında veya BinaryNumeral sınıfında kullanıcı tanımlı bir dönüştürme gereklidir. Bu durumda, RomanNumeral sınıfına gider. İki dönüşüm ekleyerek sınıfları aşağıdaki gibi değiştirebilirsiniz.
Sınıflar ve Dönüşüm Öncesi ve Sonrası
Temel türlerde olduğu gibi, sınıflar, kullanıcı tanımlı dönüştürmeden önce veya sonra ve hatta önce ve sonra gerçekleşen standart dönüştürmelere sahip olabilir. Bununla birlikte, sınıflarla ilgili tek standart dönüştürmeler, bir temel veya türetilmiş sınıfa dönüştürmelerdir, dolayısıyla bu bölümde ele alınanlar yalnızca bunlardır.
Örtük dönüştürmeler oldukça basittir; dönüşüm üç adımda gerçekleşir:
1. Türetilmiş bir sınıftan kullanıcı tanımlı dönüşümün kaynak sınıfına dönüştürme isteğe bağlı olarak gerçekleştirilir.
2. Kullanıcı tanımlı dönüştürme gerçekleşir.
3. Kullanıcı tanımlı hedef sınıfından bir temel sınıfa dönüştürme isteğe bağlı olarak gerçekleştirilir.
Bunu göstermek için, örneği yapılar yerine sınıfları kullanacak şekilde değiştirebilir ve RomanNumeral’dan türetilen yeni bir sınıf ekleyebilirsiniz.
BinaryNumeral’a örtük dönüştürme işlemi beklendiği gibidir; roman’ın RomanNumeralAlternate’den RomanNumeral’a üstü kapalı bir dönüşümü gerçekleşir ve ardından RomanNumeral’dan BinaryNumeral’a kullanıcı tanımlı dönüştürme gerçekleşir.
Açık dönüşüm bölümü, bazı kişilerin kafalarını kaşımasına neden olabilir. BinaryNumeral’dan RomanNumeral’a kullanıcı tanımlı işlev bir RomanNumeral döndürür ve RomanNumeralAlternate’e sonradan dönüştürme asla başarılı olamaz.
Kullanıcı tanımlı dönüştürme işleci artık bir RomanNumeral döndürmüyor; bir nesneye bir RomanNumeral referansı döndürür ve bunun türetilmiş bir türe referans olması tamamen yasaldır.
Bu belki garip ama yasal. Dönüştürme işlevinin gözden geçirilmiş sürümüyle, RomanNumeral başvurusunun bir RomanNumeral nesnesine mi yoksa RomanNumeralAlternate nesnesine bir başvuru olmasına bağlı olarak, BinaryNumeral’dan RomanNumeralAlternate’e açık dönüştürme başarılı olabilir.
Google Ads
Google Analytics
Dönüşüm izleme kodunu nereye eklemek uygun olur
Tag Manager
Google Tag Manager
Google Ads Dönüşüm Kurma
Google Ads dönüşüm kodu ekleme
Google Ads Dönüşüm Kimliği
Örtük Dönüşümler
Türler arasındaki dönüşümleri tanımlarken, örtük olması gereken dönüşümler, herhangi bir veri kaybetmeyen ve istisnalar oluşturmayan dönüşümlerdir. Bu önemlidir, çünkü örtük dönüştürmeler, bir dönüştürmenin gerçekleştiği açık olmadan gerçekleşebilir.
Dönüşümü daha karmaşık türde tanımlayın. Bu, temel olarak, basit bir türü daha karmaşık bir türe dönüştürmeyle karıştırmamak anlamına gelir. Önceden tanımlanmış türlerden birine ve bu türden dönüştürmeler için, kaynak mevcut olmadığından, dönüştürmeyi sınıfın bir parçası olarak tanımlamaktan başka seçeneğiniz yoktur.
Bununla birlikte, kaynak mevcut olsa bile, int sınıfında int’ten BinaryNumeral veya RomanNumeral’a dönüşümleri tanımlamak gariptir.
Bazen, örnekte olduğu gibi, sınıflar birbirinin eşidir ve daha basit bir sınıf yoktur. Bu durumda, bir sınıf seçin ve her iki dönüşümü de oraya koyun.
Bu çalışmamızda örneklerde, kullanıcı tanımlı türden sayısal türlere yalnızca tek bir dönüşüm ve sayısal türlerden kullanıcı tanımlı türe yalnızca bir dönüşüm vardı. Genel olarak, bunu yapmak ve ardından hedef türleri arasında geçiş yapmak için yerleşik dönüştürmeleri kullanmak iyi bir uygulamadır. Dönüştürülecek sayısal türü seçerken, tür için en doğal boyutu olanı seçin.
Örneğin BinaryNumeral sınıfı, int’ye örtük bir dönüştürme içerir. Kullanıcı kısa gibi daha küçük bir tür istiyorsa, kolayca bir döküm gerçekleştirebilirsiniz.
Birden çok dönüştürme varsa, aşırı yükleme kuralları geçerli olur ve sonuç, sınıfın kullanıcısı için her zaman sezgisel olmayabilir. Bu, hem imzalı hem de imzasız türlerle uğraşırken özellikle önemlidir.
Diğer Dillerde Çalışan Dönüşümler
Bazı .NET dilleri dönüştürme sözdizimini desteklemez ve tuhaf adlara sahip dönüştürme işlevlerini çağırmak zor veya imkansız olabilir. Sınıfları bu dillerden kolayca kullanılabilir hale getirmek için dönüştürmelerin alternatif sürümlerini sağlamalısınız. Örneğin, bir nesne bir dizeye dönüştürmeyi destekliyorsa, o işlevde ToString() çağrılmasını da desteklemelidir. İşte RomanNumeral sınıfında bunu nasıl yapacağınız.
Kullanıcı tanımlı dönüştürmelerle ilgili bölümü bitirmek için, derleyicinin dönüştürmeleri nasıl gördüğüne ilişkin birkaç ayrıntı biraz açıklama gerektirir. Kanlı ayrıntılarla gerçekten ilgilenenler, bunları C# Dil Referansında bulabilir.
Aday kullanıcı tanımlı dönüştürmeler ararken, derleyici kaynak sınıfı ve onun tüm temel sınıflarını ve hedef sınıfı ve onun tüm temel sınıflarını arayacaktır.
Bu örnekte, derleyici S’den T’ye dönüştürmeyi bulacak ve kullanım açık olduğu için onu TBase’e dönüştürme için eşleştirecektir; bu, yalnızca dönüştürme tarafından döndürülen T gerçekten yalnızca bir TBase ise başarılı olacaktır.
Bu kod derlenmiyor. Dönüştürme S’den TBase’e yapılır ve derleyici, T sınıfını aramadığından dönüştürmenin tanımını bulamaz.
Aşırı Operatör Yüklemesi
Operatör aşırı yüklemesi, operatörlerin bir sınıf veya yapı üzerinde tanımlanmasına izin verir, böylece operatör sözdizimi ile kullanılabilir. Bu, belirli bir işlecin ne anlama geldiğine ilişkin iyi bir tanımın olduğu veri türlerinde en kullanışlıdır ve böylece kullanıcı için bir ifade ekonomisi sağlar. İlişkisel işleçlerin (==, !=, >, <, >= ve <=) aşırı yüklenmesini ve dönüştürme işleçlerinin aşırı yüklenmesini kapsar.
Web sitelerinizi, arama motorlarında en yukarı getirmek adına sizlere 3 adet paket öneriyoruz. Bu paketler sayesinde web siteleriniz aramalarda 1 yıl içerisinde en yukarıya tırmanacaktır.
1) Backlink Paketi 50 $ (Yıllık Ücret)
2) Hızlandırma Paketi 300 $ (Yıllık Ücret)
3) Kelime Yönlendirme Paketi 150 $ (Aylık Ücret)