Şans eseri TDLP'da da aynı konuyu okuyordum. Dershane'de aynı yerdeyim :)
import std.string, std.stdio;
class Saat {
int saat;
int dakika;
int saniye;
override bool opEquals(Object o) const {
auto sağdaki = cast(const Saat) o;
return((saat == sağdaki.saat)
&&
(dakika == sağdaki.dakika)
&&
(saniye == sağdaki.saniye));
}
override string toString() const {
return format("%02s:%02s:%02s", saat, dakika, saniye);
}
this(int saat, int dakika, int saniye = 0) {
this.saat = saat;
this.dakika = dakika;
this.saniye = saniye;
}
}
class ÇalarSaat : Saat {
int alarmSaati;
int alarmDakikası;
override bool opEquals(Object o) const {
auto sağdaki = cast(const ÇalarSaat)o;
return((super == o)
&&
(alarmSaati == sağdaki.alarmSaati)
&&
(alarmDakikası == sağdaki.alarmDakikası));
}
override string toString() const {
return format("%s ♫%02s:%02s", super.toString(),
alarmSaati, alarmDakikası);
}
this(int saat, int dakika, int saniye,
int alarmSaati, int alarmDakikası) {
super(saat, dakika, saniye);
this.alarmSaati = alarmSaati;
this.alarmDakikası = alarmDakikası;
}
}
void main() {
auto değişken0 = new Saat(6, 7, 8);
auto değişken1 = new ÇalarSaat(6, 7, 8, 1, 2);
assert((değişken0 == değişken0)
&&
(değişken0 == değişken1)
&&
(değişken1 == değişken0));
}
Bu programı çalıştırdığımda 'segmentation fault' hatası veriyor.
'assert' kullanımını özellikle bu şekilde yazdım. Çünkü TDLP'de el sıkışma gibi bir kavramdan bahsediyordu. Yani 'x = y' ise 'y = x' olmalı hatta kendisiyle 'x = x' şeklinde bile karşılaştırmış. Hatta örneğin iki referans 'null' ise 'true' döndürüyor. Yani bir nesneye bağlanmamış referansla da karşılaştırma yapıyor.
Ama tüm bunları 'opEquals''ın gerçek gerçeklemesini anlatırken yapıyor. Programcı bu işlevleri kendisi yazarken de bu 'assert''lerin geçerli olmasını bekler miyiz?
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]