Konuyu görüntüle
IUCODERS FORUM > Programlama > C / C++ > Template sınıflar ve metodlar hakkında soru
Yazar
hatke


avatar
KIRCALI
Kayıt: 14.01.2006
02.11.2008-13:12 #52160
Merhabalar, danısmak istediğim bir konu var. Aslında java kodu yazıyorum ama C++ ile mantık olarak benzer oldugu için burada da sormak istedim. (Java Forumunda da sordum aslında. )

Templateler konusunda bir sıkıntı yasıyorum. Sorum soyle:

Bir template A sınıfım olsun. yani A<T> tipinde bir sınıf.

class A<T> {
private T value;

public void setValue(T val);
public T getValue();
}

Ve bir fonksiyonum olsun. Bu fonksiyon tipi belli olmayan A sınıfı
turunden objeler listesi dondursun.

//...

List<A <?>> getContent();

//..

Ben, geri donus degeri ile alınan liste icinde donerek her bir
elemanın ilgili set fonksiyonunu cagırmak istiyorum. Fakat, liste
içindeki objeler <?> ile belirtidiği için A sınıfının setValue
fonksiyonuna arguman veremiyorum. Cunku aslında T tipi henuz belli
degil.


List<A<?>> content = obj.getContent();
for (A<?> element: content) {
element.setValue(T); //T olarak ne verebilirim?
}

Nasıl bir teknikle set fonksiyonunu calıstırabilirim. Arguman olarak
verdiğim degerler T nin değeri belli olmadığı için derleyici kızıyor.

Değerli fikirlerinizi, onerilerinizi bekliyorum.

Şimdiden teşekkürler..






hozlem
Yazar
offman


avatar
Kayseri
Kayıt: 20.01.2006
02.11.2008-13:31 #52162
private List<T> GetAllObject<T>(..... Parameters, T tipinde veya başka türlerde)
{
burada işlemlerin olsun geriye List<T> turunde objeni donderiyorsun en son....
}

Member ve Product diye classların var diyelim....
List<Member> arrMember = GetAllObject<Member>(.........................);
bir list donderir geriye.....
Member oMember = GetAllObject<Member>(.............................)[0];
Yukarda gördüğün gibi indexlenebilir olduğu için istediğin indisi cekebilirsin.

List<Product> arrProduct= GetAllObject<Product>(.........................);
bir list donderir geriye.....
Product oProduct = GetAllObject<Product>(.............................)[0];
Yukarda gördüğün gibi indexlenebilir olduğu için istediğin indisi cekebilirsin.
Aynı olay her iki class içinde gösterdim orada .netin bir classıda olabilir. öönemli olan Template classının fonksiyonlarıdır.





331. KSD
*.NET DEVELOPER




Yazar
ascii


avatar
öz
Kayıt: 26.07.2006
02.11.2008-13:44 #52165
Ben olsam sanırım şöyle yapardım. Template sınıfı Türü belli olan bir belli olan basit bir sınıftan türetirdim. Java da bilmiyorum ama c++ da bir taban sınıfın türünden bir adrese türemiş sınıf adresi atanabilir.

Bence template sınıfını Base bir sınıftan türet sonra base sınıfı türünden bir liste onları sakla böylece rahatça kullanabilirsin. Daha güzel yolları vardır ama ben olsam böle yapardım.

Şimdi düşündüm de hatta bunu farklı sınıflar için yababilirsin. O zamanda sana Abstract Factory olur :D





Windows is a misunderstood Unix.


Yazar
hatke


avatar
KIRCALI
Kayıt: 14.01.2006
02.11.2008-17:04 #52170
Oncelikle cevaplar icin tesekkurler.

Fakat benim getContent fonksiyonunu degistirmemem gerekiyor. Kullandıgım kutuphanenin methodu. setValue da aynı sekilde.

//...

List<A <?>> getContent();

//..

Fonksiyonun imzası degismeyecek. Zaten fonksiyon <?> yani "unknown" turunden degerler dondurdugu icin bir sey yapamıyorum. Yani ben buna <T> desem ne verirsem ona gore işlem yaparım ama <?> iken devam etmem gerekiyor. <?> iken de compile time da derleyici turunu bilmediği için ne verirsem vereyim cast edemiyor. Bole bir durumda ben set cagıramıyor muyum? Javada buna wildcard deniliyor. Bu sekilde kullanmanın yolunu biliyormusunuz?

Yardımlar için tekrar teşekkurler...





hozlem
Yazar
hatke


avatar
KIRCALI
Kayıt: 14.01.2006
02.11.2008-17:30 #52173
getContent sınıfı T turunden obje listesi dondurmuyor. Cunku tum objeler aynı turden olmak zorunda degil.

Bu mantık yuzunden setValue fonksiyonuna arguman vermekte zorlanıyorum. Cunku birinde String digerinde int hatta kendi tanımladıgımız bir tur de olabilir.





hozlem
Yazar
neurorebel


avatar

Kayıt: 15.08.2007
02.11.2008-17:41 #52175
çözmeye çalıştığın problem tam olarak nedir acaba ?





Do weird and difficult things.

Yazar
ali


avatar
istanbul
admin
Kayıt: 04.01.2006
02.11.2008-19:53 #52189
hatke yazdi
 
getContent sınıfı T turunden obje listesi dondurmuyor. Cunku tum objeler aynı turden olmak zorunda degil.

Bu mantık yuzunden setValue fonksiyonuna arguman vermekte zorlanıyorum. Cunku birinde String digerinde int hatta kendi tanımladıgımız bir tur de olabilir.


kulandigin (dondurdugun) her class icin atama operatorunu (=) overload edebilirsin. set value yerine direk atama operatoru kullanirsan, ilgili her classin o operatoru kullanilir.

en kolay cozum bu olur herlade. ama biraz riskli olabilir :)





free software is a matter of liberty, not price. to understand the concept, you should think of free speech, not free beer.
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
02.11.2008-21:26 #52204
Generic kullanım byte koda çevrilirken normal koda dönüştürülür dolayısıyla senin o nesnenin setvalue fonksiyonunun olması zorunlu. fakat tipinin ne olduğunu bilmediğin için sen elemanın değerini set etmekten ziyade alinin bahsettiği üzere "=" eşitlemen lazım.
yada şu aşamada
for (A<?> element: content) {
Obje o=(ObjTip)element;
//tip.setvalue yada ona benzer bişi
} 






N/A
Yazar
neurorebel


avatar

Kayıt: 15.08.2007
02.11.2008-22:09 #52207
işte her iki öneride de kullandığın tipler arası dönüşüm operatörünün tanımlı olması gerekir ki;
aslında bu, yaklaşımını değiştirmen gerektiği manasına geliyor. problemi anlatırsan kısaca yardımcı olunabilir.:)





Do weird and difficult things.

Yazar
hatke


avatar
KIRCALI
Kayıt: 14.01.2006
02.11.2008-22:25 #52209

JAXBElement<java.lang.String> content = (JAXBElement<java.lang.String>)obj.getAllTypes().getContent().get(0);

content.setValue("123456");

Yukarıdaki şekilde amacıma ulaştım. Ancak pek hoş bir yöntem değil, çünkü şöyle bir uyarı mesajı alıyorum:
"Type safety: Unchecked cast from JAXBElement<capture#1-of ?> to JAXBElement<String>".

Dinamik olarak nesnenin tipini vermeden ilgili fonksiyonu çağırmak istedim. Ama cast hatası veriyordu. Ben de, listedeki elemanların sırasıyla hangi tipte olduğunu bildiğim için sırayla cast ettim.

Yorumlar için herkese teşekkürler...





hozlem
Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb