D Programlama Dili – Programlama dersleri ve D referansı
Ali Çehreli

kalıtım: [inheritance], başka bir türün üyelerini türeme yoluyla edinmek
... bütün sözlük



İngilizce Kaynaklar


Diğer




alias this

Başka bağlamlarda başka anlamlara gelen alias ve this anahtar sözcükleri bir arada kullanıldıklarında farklı bir anlam kazanırlar. Bu yüzden, ikisi bir arada kullanıldığında tek bir anahtar sözcük olarak kabul edilmelidirler.

alias this, bir yapının veya sınıfın otomatik tür dönüşümü yoluyla başka türler yerine geçmesini sağlar. Tür dönüşümü için başka bir seçenek İşleç Yükleme bölümünde gördüğümüz opCast işlecidir. Farkları, opCast'in açıkça yapılan tür dönüşümleri için, alias this'in ise otomatik tür dönüşümleri için kullanılmasıdır.

Bu iki sözcük birbirlerinden ayrı olarak yazılırlar; aralarına yapının veya sınıfın bir üyesi gelir:

    alias üye_değişken_veya_işlev this;

alias this yapının veya sınıfın türünü gerektiğinde belirtilen üyenin türüne otomatik olarak dönüştürmeyi sağlar. Dönüşüm sonucunda üretilen değer o üyenin değeridir.

Aşağıdaki Kesir örneği alias this'i bir üye işlev ile kullanıyor. Daha aşağıdaki AraştırmaGörevlisi örneğinde ise alias this'in üye değişkenlerle kullanımlarını göreceğiz.

değeri işlevinin dönüş değeri double olduğundan, aşağıdaki alias this bildirimi Kesir nesnelerinin double değerler yerine kullanılabilmelerini sağlar:

import std.stdio;

struct Kesir {
    long pay;
    long payda;

    double değeri() const @property {
        return double(pay) / payda;
    }

    alias değeri this;

    // ...
}

double hesap(double soldaki, double sağdaki) {
    return 2 * soldaki + sağdaki;
}

void main() {
    auto kesir = Kesir(1, 4);    // 1/4 anlamında
    writeln(hesap(kesir, 0.75));
}

Yukarıdaki yapının nesneleri double türünde değer beklenen ifadelerde geçtiklerinde değeri işlevi çağrılır ve o işlevin döndürdüğü değer kullanılır. Yukarıdaki kodda aslında double bekleyen hesap işlevine bir Kesir nesnesi gönderilebilmiş ve o hesapta değeri işlevinin döndürdüğü 0.25 kullanılmıştır. Program, 2 * 0.25 + 0.75 hesabının sonucunu yazdırır:

1.25
Çoklu kalıtım

Sınıfların en fazla bir class'tan türetilebildiklerini daha önce Türeme bölümünde görmüştük. (Hatırlayacağınız gibi, interface'ten türeme konusundan böyle bir kısıtlama yoktur.) Nesne yönelimli programlama dillerinden bazıları birden fazla sınıftan türetmeye de izin verirler. Birden fazla sınıftan türetmeye çoklu kalıtım denir.

alias this sınıfların çoklu kalıtıma uygun olarak kullanılabilmelerini de sağlar. Birden fazla alias this bildirimi kullanıldığında o yapı veya sınıf o bildirimlerin sağladıkları bütün otomatik tür dönüşümlerinde kullanılabilir.

Not: Bu bölümdeki kodların en son denendikleri derleyici olan dmd 2.072 yalnızca tek alias this bildirimine izin veriyordu.

Aşağıdaki AraştırmaGörevlisi sınıfı kendi içinde Öğrenci ve Öğretmen türlerini üye değişkenler olarak tutuyor. Bu türün nesneleri alias this bildirimleri sayesinde hem öğretmen hem de öğrenci gereken yerlerde kullanılabilirler:

import std.stdio;

class Öğrenci {
    string isim;
    uint[] notlar;

    this(string isim) {
        this.isim = isim;
    }
}

class Öğretmen {
    string isim;
    string ders;

    this(string isim, string ders) {
        this.isim = isim;
        this.ders = ders;
    }
}

class AraştırmaGörevlisi {
    Öğrenci öğrenciKimliği;
    Öğretmen öğretmenKimliği;

    this(string isim, string ders) {
        this.öğrenciKimliği = new Öğrenci(isim);
        this.öğretmenKimliği = new Öğretmen(isim, ders);
    }

    /* Bu iki bildirim sayesinde bu tür hem Öğretmen hem de
     * Öğrenci olarak kullanılabilir.
     *
     * Not: dmd 2.072 birden fazla 'alias this' tanımını
     *      desteklemez. */
    alias öğretmenKimliği this;
    alias öğrenciKimliği this;
}

void dersSaati(Öğretmen öğretmen, Öğrenci[] öğrenciler)
in {
    assert(öğretmen !is null);
    assert(öğrenciler.length > 0);

} body {
    writef("%s öğretmen şu öğrencilere %s anlatıyor:",
           öğretmen.isim, öğretmen.ders);

    foreach (öğrenci; öğrenciler) {
        writef(" %s", öğrenci.isim);
    }

    writeln();
}

void main() {
    auto öğrenciler = [ new Öğrenci("Özlem"),
                        new Öğrenci("Özgür") ];

    // Hem Öğretmen hem de Öğrenci olabilen bir nesne:
    auto arkan = new AraştırmaGörevlisi("Arkan", "matematik");

    // 'arkan' bu kullanımda Öğretmen kimliğindedir:
    dersSaati(arkan, öğrenciler);

    // Aşağıdaki kullanımda ise öğrencilerden birisidir:
    auto ayşeHoca = new Öğretmen("Ayşe", "fizik");
    dersSaati(ayşeHoca, öğrenciler ~ arkan);
}

Programın çıktısı aynı nesnenin otomatik olarak farklı türler yerine kullanılabildiğini gösteriyor:

Arkan öğretmen şu öğrencilere matematik anlatıyor: Özlem Özgür
Ayşe öğretmen şu öğrencilere fizik anlatıyor: Özlem Özgür Arkan