Yazar |
|
hatke
KIRCALI
Kayıt: 14.01.2006 |
|
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
Kayseri
Kayıt: 20.01.2006 |
|
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
öz
Kayıt: 26.07.2006 |
|
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
KIRCALI
Kayıt: 14.01.2006 |
|
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
KIRCALI
Kayıt: 14.01.2006 |
|
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
Kayıt: 15.08.2007 |
|
çözmeye çalıştığın problem tam olarak nedir acaba ?
Do weird and difficult things.
|
|
Yazar |
|
ali
istanbul
admin
Kayıt: 04.01.2006 |
|
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
istanbul
admin
Kayıt: 17.11.2005 |
|
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
Kayıt: 15.08.2007 |
|
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
KIRCALI
Kayıt: 14.01.2006 |
|
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
|
|
| | | | | | |