Forum: Ders Arası RSS
Object.factory ne işe yarıyor ve nasıl kullanılıyor ?
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Object.factory ne işe yarıyor ve nasıl kullanılıyor ?
Object.factory ne işe yarıyor ve nasıl kullanılıyor ?
Bu mesaj canalpay tarafından değiştirildi; zaman: 2010-07-07, 13:17.
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ı
İsmiyle belirtilen sınıftan bir nesne oluşturuyor:

class BirSınıf
{
    void foo()
    {}
}
 
class BaşkaSınıf
{
    void bar()
    {}
}
 
void main()
{
    auto a = cast(BirSınıf)Object.factory("deneme.BirSınıf");
    a.foo();
 
    auto b = cast(BaşkaSınıf)Object.factory("deneme.BaşkaSınıf");
    b.bar();
}

Başka dillerde elle halletmek zorunda kalabileceğimiz bir olanağın D tarafından kolayca halledilmiş hali.

Öyle kullanılabilen sınıfların ya kurucuları hiç olmamalıymış; ya da yalnızca varsayılan kurucuları olmalıymış.

Ali
acehreli (Moderatör) #3
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ı
Söylemeyi unuttum: sınıfın ismi olarak, onun nesneleri için normalde toString ne yazıyorsa o kullanılıyor. Benim örneğimde modül ismi "deneme" olduğu için başına "deneme." geldi.

Ayrıca, oluşturulamamışsa null dönüyor. Denetlemeden kullanmamak gerek.

Ali
acehreli (Moderatör) #4
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ı
Söylemeyi unuttum: sınıfın ismi olarak, onun nesneleri için normalde toString ne yazıyorsa o kullanılıyor. Benim örneğimde modül ismi "deneme" olduğu için başına "deneme." geldi.

Ayrıca, oluşturulamamışsa null dönüyor. Kullanmadan önce denemek şart.

Ali
canalpay (Moderatör) #5
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler.

Bende TDPL'nin ücretsiz paylaşılan kitabın ilk kısmında olan koduda örnek olarak yazayım:

import std.contracts, std.stdio;
 
void main(string[] args){
    Stat[] stats;
    foreach (arg; args[1..$]){
        auto newStat = cast(Stat) Object.factory("stats." ~ arg);
        enforce(newStat, "Invalid statistics function : "~arg);
        stats ~= newStat;
    }
    for(double x; readf(" %f ", &x)==1;) {
        foreach(s; stats){
            s.accumulate(x);
        }
    }
    foreach (s; stats){
        s.postprocess();
        writeln(s.result());
    }
}
interface Stat {
    void accumulate(double x);
    void postprocess();
    double result();
}
class Min : Stat {
    private double min = double.max;
    void accumulate(double x) {
        if(x<min){
            min=x;
        }
    }
    void postprocess() {}
    double result(){
        return min;
    }
}
   

Tabii bu kod dmd 2.048 ile çalışacak. Çünkü readf std.stdio'ya o sürümde konmuş olacak. Ancak Andrei kitabında daha yeni desteklenecek olan olanağı aklında tasarlamış. Ve bu tasarlamayı aylarca önce yapmış. Bu bakımdan tebrik etmek gerekiyor. Bu ayrıca D2'ye artık ne eklenip ne çıkacağı belli demek oluyor.
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, 05:56:41 (UTC -08:00)