Thread overview
Kurucu İşlevi Döngü veya Etiket İçinden Çağırmak
Jul 17, 2012
Kadir Can
Jul 17, 2012
Kadir Can
July 17, 2012

Merhaba arkadaşlar;
Turna için kod yazmaya devam ediyorum ve bazı şekil belirleyici html etiketlerini oluşturmaya başladım. abbr ve acronym etiketleri bir de title istedikleri için onları ayrı bir sınıfa aldım ve kullanıcının istediği tipe göre seçilmelerini final switch() ile sağlamaya çalıştım; ancak super()'ı final switch() içinden çağırmaya izin vermiyor. Verdiği hatayı aşağıda yazdım. Bana mantık olarak yanlış gibi geldi, sonuçta iki farklı duruma göre iki farklı nesneye sahip olmak isteyebiliriz, değil mi?
Aklıma şöyle bir çözüm geldi, package sarma derecesine sahip bir setTag() işlevi ekleyebiliriz, ama bu biraz riskli olabilir gibi geldi; çünkü her Xml elemanının bir etiketi olmalı, sonraya bırakılmamalı diye düşünüyorum. Siz ne dersiniz?

/* Enumeration for type of abbreviations */
enum abbreviationType{abbreviation, acronym};

/*
* Class for abbreviations
* title is the full text of abrreviation(or acronym)
* eg: <abbr title="World Health Organization">WHO</abbr>
* In this example, "World Health Organization" is the tittle.
*/
class Abbreviation : XmlElement
{
	this(abbreviationType type, string title, string abbreviation)
	in
	{
		assert(abbreviation.length > 0);
	}
	body
	{
		final switch(type){
			case abbreviationType.abbreviation : super("abbr"); break;
			case abbreviationType.acronym : super("acronym"); break;
		}
		setAttributes(["title" : title]);
		setContent(abbreviation);
	}
}
schemehelper.d(68): Error: constructor calls not allowed in loops or after label
s
schemehelper.d(69): Error: constructor calls not allowed in loops or after label
s

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

July 17, 2012

Teşekkürler, birnci çözüm aklıma gelmişti, onu uyguladım.
Şu an birim testleri geçiyor.
Bu arada bahsetiiğimiz modülün adını schemehelper olarak düşünmüştüm; ama sanırım çok uygun olmadı. Başka fikirler var mı?

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

July 17, 2012

Haklısın. final switch olduğuna göre mutlaka birisi işletilecek demektir. Başka çözümler de bulunabilir ve senin de aklındadır ama şöyle bir değişiklik olabilir:

       string etiket;

       final switch(type){
           case abbreviationType.abbreviation : etiket = "abbr"; break;
           case abbreviationType.acronym : etiket = "acronym"; break;
       }

       super(etiket);

Yine de gerçekten farklı türler de ekleyebilirsin bunlar Abbreviation'dan türeyebilirler ve gereken etiketi Abbreviation'a verebilirler (tabii o zaman belki de Abbreviation'a daha başka bir isim düşünmek gerekebilir):

class Abbreviation_Başkaİsim{}

class Abbreviation : Abbreviation_Başkaİsim {
   this() { super("abbr"); }
}

class Acronym : Abbreviation_Başkaİsim {
   this() { super("acronym"); }
}

Ali

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