Thread overview
Object.factory ne işe yarıyor ve nasıl kullanılıyor ?
July 07, 2010

Object.factory ne işe yarıyor ve nasıl kullanılıyor ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2010

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2010

İ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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2010

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 07, 2010

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]