Forum: Ders Arası RSS
Sınıflar arasında dolaylı üye erişimi
Doğru mu yaptım?
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Sınıflar arasında dolaylı üye erişimi
Biliyorum...:)

Sınıflar arasında miras alma olayı olduğundan böyle bir şey gereksiz görülebilir. Bir yerde ihtiyaç duyduğum için sormak istiyorum; doğru mu yaptım?

Aşağıdaki kodda amacım kısaca şu: Kurulmuş olan sınıfın, istenildiği zaman kullanılan üyesinin (işlev) adresini temsilci (delegate) yoluyla başka bir sınıfa bildirmek. Sonuçta bu sınıf üzerinde dolaylı bir erişim söz konusu oluyor; gülmeyin...:D
import std.stdio;
 
class Foo
{
    int result;
    int delegate(int) func;
    
    this(int delegate (int) k)
    {
        this.func = k;
    }
    
    void exec(int x)
    {
        for(int i = 0; i < x; i++)
        {
            result = func(i);
        }
    } 
}
 
class Bar
{
    alias recursive_func a;
    
    int recursive_func(int l) {
        return l ? l + a(l - 1) : 0;
    }
}
 
void main()
{
    auto bar = new Bar();
        
    foreach(n; 1..10)
    {
        auto nesne = new Foo(&bar.a);
             nesne.exec(n);
             nesne.result.write("\t");
             nesne.clear;
    }
    writeln;
}
Kod istenildiği gibi çalışıyor ama hatalarım olabilir...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben bir gariplik görmüyorum. Özellikle eğer Bar'ın aynı tanıma uyan birden fazla temsilcisi varsa hangisinin seçildiği böyle bildirilmiş olur.

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Peki hocam,
this(int delegate (int) k) {
  //... 
Tanımını daha genelleştirmek mümkün olabilir mi? Yani aynı sınıfı kullanarak çift parametre alan başka bir işlevi de kullanmak istesem bunu yapabilir miyiz; ya da dönüş değeri farklı olan...

Görünüşe göre yapamıyoruz ve nesne adeta parametre verilen işlev ile özelleşmiş durumda...:(

Şablon ile oldu...:)
class Foo(T)
{
    int result;
    T func;
    
    this(T k)
    {
        this.func = k;
    }
    :    :    :
void main()
{
    auto bar = new Bar();
    alias int delegate(int) f;
 
    foreach(n; 1..10)
    {
        auto nesne = new Foo!f(&bar.a);
    :    :    :
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-10-20, 01:00.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 08:11:06 (UTC -08:00)