aquila Mesaj tarihi: Ocak 30, 2010 Paylaş Mesaj tarihi: Ocak 30, 2010 olm neler diyosunuz yaaa. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Ceday Mesaj tarihi: Ocak 30, 2010 Paylaş Mesaj tarihi: Ocak 30, 2010 B extends A diyelim, B foo yu override ederse, A nın consturctorında yapması gereken isler yalan olur. o yüzden private yapabilirsin.. amaaa.. yapmayabilirsin de.. ne yapmak istedigine baglı bişi bu.. edit: gerçi B nin override etmesini istedigin durumlarda. A nın altında bi sub class daha yaratp o methodu abstract yapıp A da override etmek en dogrusudur. B de davranısı degistirmek istersen B de override edebilir böylece. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Mirage Mesaj tarihi: Ocak 30, 2010 Konuyu açan Paylaş Mesaj tarihi: Ocak 30, 2010 Neyse herkesi çatlatmadan ben açıklıyayım bari. Şimdi gördüğünüz üzere A class'ına bakan kimse bir hata görmüyor. Doğrudan bir hata yok zaten. Sonra kalkıp başka biri A'yı extend eden bir class yazıyor. Doğal olarak bazı metodları da kendine göre override ediyor. Şekil 1a: public class B extends A { private SuperBirTip tip; public B(SuperBirTip tip) { this.tip = tip; } @Override public void foo() { System.out.println(tip.toString()); } } Bakalım bu class'a bakınca hatayı görecek misiniz? :) Edik: şimdi ona da takılmayın diye public/private ekledim Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Ceday Mesaj tarihi: Ocak 30, 2010 Paylaş Mesaj tarihi: Ocak 30, 2010 işte B nin foo su A nın icinde cagrılacagından olay gg oluo. en basta dedigim gibi private yapman lazım :)) Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Mum_Chamber Mesaj tarihi: Ocak 30, 2010 Paylaş Mesaj tarihi: Ocak 30, 2010 sorun constructor'dan direkt metod cagirmak cunku adam override ettiginde bir degiskene erismeye calismis. fakat new B() olarak cagirilinca da foo()'yu calistirmaya calisacak, ama tip degiskeni tanimlanmamis olacak burada bence A class'inda degil sorun, B'nin her iki constructor'i da override etmemesinde Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Ceday Mesaj tarihi: Ocak 30, 2010 Paylaş Mesaj tarihi: Ocak 30, 2010 cık sorun A da :) B nin foo yu override etmesini önlemek icin private yapmalı. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Mirage Mesaj tarihi: Ocak 30, 2010 Konuyu açan Paylaş Mesaj tarihi: Ocak 30, 2010 Mum_Chamber said: sorun constructor'dan direkt metod cagirmak cunku adam override ettiginde bir degiskene erismeye calismis. fakat new B() olarak cagirilinca da foo()'yu calistirmaya calisacak, ama tip degiskeni tanimlanmamis olacak bingo :) Ceday said: cık sorun A da :) B nin foo yu override etmesini önlemek icin private yapmalı. Bunu baştan söyleseydin tamam derdim ama sen metod dışardan çağırılması saçma olur diye private yap demişsin, ki bunun sorunla bir ilgisi yok. Ceday said: kodsal bi hata yok ama, private yapman lazım mantıken. print methodunun cagrılması dısardan sacma olur. Beklediğim cevap şuydu: "Constructor içinde virtual (override edilmesi mümkün olan) metod çağırmak tehlikelidir." Metodu private yapmak sorunun oluşmasını engelliyor tabi. Ama her metodu kafana göre private/public yapamazsın. O metod dışarıdan çağırılması düşünülerek yazılmışsa public yapmak zorundasın. O yüzden ilk yanıtımda metodun isteyerek public yazıldığını söylemiştim. Yoksa olayın esprisi kalmıyor zaten. Constructor içinde virtual metod çağırdığın anda, o metod override edilirse, daha hiç bir field'i initialize edilmemiş bir nesnenin metodunu çağırmış oluyorsun. Bu da benzer hatalara yol açıyor. Mesela B class'ındaki 'foo' metodunu yazan kişi 'tip' field'inin null olmadığını düşünmekte haklı sayılabilir. Çünkü B constructor'unda 'tip'e bir atama yapıyor. Ama A constructor'unda 'foo' metodu çağrıldığı için daha o atama gerçekleşemeden 'foo' metoduna girmiş oluyorsun. Sorun A'da mı peki? O da tartışılır. Asıl sorun Java'nın bu tip hatalara karşı bir önlem almamasında belki de. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Brigand Mesaj tarihi: Ocak 30, 2010 Paylaş Mesaj tarihi: Ocak 30, 2010 Kojiroh said: Constructor değil mi o? Edit: Şu print() metodunun içinde parantez içinde ama strin tanımlamasının dışında ; kullanılmış, "...";); olmuş. dfgdf class adına bakmamışım bile hiç dfgdfg Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Ceday Mesaj tarihi: Ocak 31, 2010 Paylaş Mesaj tarihi: Ocak 31, 2010 sorun javayla alakalı deil ki. her dilde var bu olay. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Brigand Mesaj tarihi: Ocak 31, 2010 Paylaş Mesaj tarihi: Ocak 31, 2010 javada her fonksiyon virtual olduğundan tehlikeli tabi. "final" keyword'ü kullanabilirsiniz non-virtual yapmak için. tam çalışmasını bilmiyorum ama açıklamalarda non-virtual fonksiyon define etmek için kullanılır yazılmış. yani burada amaç önemli. hata yok aslında, herşey nasıl kullanmak istediğine göre değişir. belki de o printin sen override edilmesini istiyorsun. eğer hata diye düşünüyorsanız bunu, hadi tehlike diyelim, "virtual function" kendisi tamamen tehlike olmuyor mu olay tamamen nasıl implement etmek istediğiniz... Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Mirage Mesaj tarihi: Ocak 31, 2010 Konuyu açan Paylaş Mesaj tarihi: Ocak 31, 2010 Private metodlar da virtual değil. Override edilemiyorlar sonuçta. Ceday said: B nin foo yu override etmesini önlemek icin private yapmalı. Ama burda dediğin gibi override etmesin diye private yapmak yanlış vidayı döndürmek bence. Brigand'ın dediği gibi, override etmesini önlemek isteyen final yapar metodu. Private yapılacaksa dışardan erişilmesini önlemek için yapılmalı, override edilmemesi için değil. Ceday said: sorun javayla alakalı deil ki. her dilde var bu olay. Her dilde olması şart değil. Çoğu dilde mümkün doğru, ama bu tür sorunları önlemeyi sağlayan mekanizmalar da var. Yarın katılacağım bir seminerde bu sistemleri sunuyorum. Seminer paper'ım buna çözüm getiren sistemlerden birini anlatıyor. İlgilenen varsa: Masked Types for Sound Object Initialization Bu konuyu açmamın sebebi de bunla ilgili küçük bir deney yapmaktı aslında. Nerdeyse kimse bu class'lara tek başına baktığında bir sorun olduğunu düşünmüyor. Yıllarca Java tecrübesi olan, işlerinde prof. olarak Java kullanan kişiler de bir sorun göremedi. Ancak iki class'ı yanyana verip, "bak bakalım sorun nerde" dediğin bulabiliyorlar. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Brigand Mesaj tarihi: Ocak 31, 2010 Paylaş Mesaj tarihi: Ocak 31, 2010 javada private methodlar virtual değil de ve override edilemiyor mu yoksa virtual fakat private olduklarından mı override edilemiyor? bana 2.si gibi geldi sanki? Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Ceday Mesaj tarihi: Ocak 31, 2010 Paylaş Mesaj tarihi: Ocak 31, 2010 yani şimdi şöle. constructarda kullandıgın methodların private olmasında fayda var. ama illa ki private yapacagın die birsey de yok. bu senin nasıl birsey design ettigine baglı. üstte biryerlerde yazdım ama tam anlatamamıs da olabilirim. atıyorum classında bir List objesi var. costructorda initalizeList die method vagırıp bunu ArrayList die initialize ediosun. senin classını extend eden baska bir class da initializeList methoduu override edip List interface'ini impelemente eden baska bir classla initialize ediyor. bu basit bi örnek oldu, bunu yapmanın baska yolları da var belki ama dedigim gibi bu tamamen senin nasıl birsey design etmeye calısmanla alakalı. ha belki böle durumlarda public yerine protected kullanırsın o ayrı. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Mum_Chamber Mesaj tarihi: Ocak 31, 2010 Paylaş Mesaj tarihi: Ocak 31, 2010 ozunde cok guzel bir ornek bu. parent class'a bakinca hatayi ongormek cok zor, child'i gorunce hersey bir anda netlesiyor Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Öne çıkan mesajlar