Zafer, söylediklerinin hepsi gerçekten bütünüyle doğru ve üstelik @property'nin kullanımıyla ilgili konular ama @property'yi anlatmıyorlar.
@property, bir üye işlevin sanki işlev değil de bir üye değişkenmiş gibi kullanılmasını sağlar. Evet, sarma vardır ama @property sözcüğünün sağladığı tek olanak o işlevi parantezsiz olarak çağırabilmek.
"Sanki bir üye değişkenmiş" olabilmesi için de @property işlevlerin isimlerinin "get", "set", "getir", "ayarla", vs. gibi eylem içermemesi önemli. O zaman üye değişken gibi olmuyorlar.
Senin örneğini aşağıdaki gibi değiştirmek isterim. Önce nitelik işlevleri ile karışmasın diye üyenin isminin sonuna alt çizgi ekliyorum. Hmmm... ve değişken ve işlev isimlerinde "ütü"leri de kaldırıyorum; zaten bir ütü sınıfı içindeyiz.
Ek olarak sanırım enforce()'un mantığı ters olmuş. Yüzden fazla olmaması gerekiyor, değil mi? (Bir düzeltme daha: erişim @property işlevinin void olmaması gerekiyor.)
import std.stdio;
import std.exception;
class Ütü
{
int sicaklik_; // 0..100 derece
this()
{
sicaklik_ = 0;
}
@property public int sicaklik()
{
return sicaklik_;
}
@property public void sicaklik(int yeniSicaklik)
{
enforce((yeniSicaklik >= 0) && (yeniSicaklik <= 100),
"Ütü sıcaklığı bu değere ayarlanamaz.");
sicaklik_ = yeniSicaklik;
}
}
void main()
{
auto ütü = new Ütü();
/* Sanki ütü'nün 'sicaklik' isminde bir üyesi vardır. Onu
* bir üye değişken gibi kullanabiliriz:*/
ütü.sicaklik = 42;
writeln(ütü.sicaklik);
}
(Not: @propert'yi denemek isteyenler dmd'yi mutlaka -property seçeneği ile kullansınlar yoksa zaten her üye işlev parantezsiz çağrılabildiği için @property'nin anlamı kalmıyor.)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]