Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Java Subclass Visibility hedesi (protected - private arası?)


Mirage

Öne çıkan mesajlar

Selam,

olay şu:

Protected visibility kullandığımızda paket içinden erişebiliyoruz. Ayrıca subclass içindeysek, paket dışında olsak bile erişebiliyoruz.

Package visibility kullandığımızda sadece paket içinden erişebiliyoruz. Paket dışında subclass içinde olsak bile erişemiyoruz.

Private ile sadece kendi class'ımızdan erişebiliyoruz.

Benim istediğim ise şu: Sadece kendi class içinden VE subclass'larından erişime izin verecek bir visibility istiyorum. Yani protected gibi, ama subclass içinde değilsen paket içinden erişemeyeceksin.

Javadaki normal visibility keyword'leri ile olmuyor sanırım böyle bir şey? Runtime'da kontrol edip subclass dışından erişilmeye çalışıyorsa exception fırlatatıp sonra da programı bitirebilirim tabii, ama compile sırasında hata verecek bir yol arıyorum. Bilgi verebilecek varsa sevinirim.
Link to comment
Sosyal ağlarda paylaş

Mesela en üst class içinde tanımladığım değişkeni private yapıp, getter methodunu dediğim şekilde yapmak istiyorum. Bu değişken sadece o class ve subclass'ları ile ilgili. Getter methodunu protected yaptığım zaten bütün paket içinden erişilebilecek. Erişilemesin istiyorum ben de.

Düşünürken kafama takıldı bu olay. Daha ihtiyacım olmadı. Belki de gerçekten de gerekmeyen bir şeydir. Java gibi bir dilin böyle bir şeyi "unutacak" hali yok.
Link to comment
Sosyal ağlarda paylaş

Garip, c#'taki "protected" tam da istediğin şeyi yapıyor. Ama Java'da access modifier'lar, c#'a göre daha az ve istediğin yönde bir şey yapılamıyor. Kaldı ki bence bu dilin eksikliği.

Java'daki "protected", dengesiz bir davranış sergiliyor gibi... Mantıklı gelmedi bana.

Oysa c#'taki protected (yani senin istediğin şey, ya da "protected internal" istiyorsun. orayı tam anlamadım.), yazılım geliştirme aşamasında geliştiricilerin senkron olarak rahat çalışması açısından faydalı oluyor.

Daha da önemlisi, oop'ye ters bir şey, class dışından property'sini istediğimiz zaman çağırabilmemiz. kuş nesnesini ele alalım; her kuşun kanadı vardır ama insanın kanadı yoktur. c#'ta kanat özelliğini protected yaparak, insanın kanat özelliğini almasını engelleyebiliriz. java'da ise anladığım kadarıyla bunu yapamıyoruz...

java konusunda pek bir bilgim yok aslında. yukarıda yazdıklarımın temelini tamamen şuraya dayandırdım.
Link to comment
Sosyal ağlarda paylaş

iyi de nie böyle birşeyi yapmak istedigini ben hala anlamadım. dielim ki sen bir library yazıosun yayınlamak icin, kendine bir packege yarattın. simdi ya subclasslar ya da aynı packagetakiler erişio. aynı packageta erişebilecek classlar, yine senin yazdıgın classlar olacak, subclass olarak erişebilecek olanlar ise senin yazdıgın libraryi kullananlar dielim. burda aslında dezavataj yok ki, library yaratan kişiye kolaylık saglıo.
Link to comment
Sosyal ağlarda paylaş

şöyle diyelim;

java'yı basit bir scripting dili olarak kullanabilirsin. bunun bir sakıncası olmadığını düşünüyorsan, bunu yapabilirsin. karşında bir engel yok.

ama nesne yönelimli programlama dili diyorsak, class dışından protected property çağırma mantığı yanlış. üstteki mesajımda açıkladığım gibi, kendime özel bir property'i mantık olarak başka bir class kullanamamalı.

eğer ki "ne olacak, zaten kendi assembly'min içinde, kime ne zararı var? ben kendim de ayarlayabilirim onu" diyorsak zaten dili aradan çıkarmış oluruz. örneğin javascript de nesne yönelimli bir dildir ama kuralları çok esnektir. nesne yönelimli kullanmak tamamen yazanın elindedir. bu onun gibi bir şey oluyor. mesela her şeyi public tanımlayalım, olsun bitsin =)

sonuçta ben bunu sakıncalı buluyorum. pek tabii derlendikten sonra hiç bir farkı yok ortaya çıkanın ;)
Link to comment
Sosyal ağlarda paylaş

said:
simdi ya subclasslar ya da aynı packagetakiler erişio. aynı packageta erişebilecek classlar, yine senin yazdıgın classlar olacak, subclass olarak erişebilecek olanlar ise senin yazdıgın libraryi kullananlar dielim. burda aslında dezavataj yok ki, library yaratan kişiye kolaylık saglıo.


Kolaylık sağlasın diye tüm methodları public de yapabilirim o mantıkla. "Least privilege prinzip" amca saolsun, gerektiğinden fazla visibility vermemek gerekiyor.

Aynı paketi birden fazla kişi de geliştirebiliyor sonuçta. Bu durumda methodu adam gibi dökümanlamazsan, sadece class ve subclass içinden ulaşılabilmesini istediğim şeyi, başka biri "nasılsa protected" diye paket içinden kullanabilir.

Halbüki dediğim şekilde olsa, biri metodu kullanmaya çalıştığında compiler dayı hemen dicek "hop kardeş dur buna yetkin yok". Adam da anlayacak erişmemesi gereken bir şeye erişmeye çalıştığını.

edit: Böyle bir şey buldum:
The Java protected keyword means "accessible to inheritors and to others in this package." There is no equivalent to the C++ protected keyword that means "accessible to inheritors only" (private protected used to do this, but the use of that keyword pair was removed).

[ Mesaj 28 Mayıs 2007, Pazartesi - 10:55 tarihinde, Mirage tarafından güncellenmiştir ]
Link to comment
Sosyal ağlarda paylaş

arkadaslar protected methodları zaten ne yaptıgı iyice bilmeyen birisi kullanmaz. kullanan adam da methodun identifierını görüyor sonucta. biliyorsa kullanır, bilmiyorsa kullanmaması gerekir.

C++'taki friend mantıgı gibi birşey burdaki. aynı packagetaki classlara da bu methodları kullanma yetkisi veriliyor ki, bence mantıksız birşey deil. implementation safhasında bu sekilde seylere ihtiyac duyabiliyorsunuz.

protected indetifierı zaten bunun ne halt yedigini bilmiosan, kullanma demek. adam zaten ben illa kullanıcam dedikten sonra istersen private yap hic farketmez..
Link to comment
Sosyal ağlarda paylaş

ceday, sen diyorsun ki access modifier'ları bir kenara at =)

yani pek tabii adam access modifier nedir ne değildir bilmiyorsa, sen ne yaparsan yap o bozar.

ama bu mantığı geliştiren adamlar access modifier diye bir şey yapmışlar. alın kullanın demişler. ben de diyorum ki "access modifier kullanıyorsam böyle böyle olmalı". En başta da belirttim, yoksa java'yı (ya da herhangi bir dili) kurallarından bağımsız kullanma hakkı da bende tabii ki =)
Link to comment
Sosyal ağlarda paylaş

abi access modifierı kenara at demiyorum.

ama protected methodları aynı packagetaki herseyin kullanması o kadar abest birsey deil diyorum. sonucta genel olarak aynı packageta baska birsey yazılıyorsa, ve bu kişi bu methodu kullanıyorsa, methodun nasıl kullanılacagına hakimdir diyorum.

packaging mantıgı olay yani.
Link to comment
Sosyal ağlarda paylaş

Ceday doğru diyorsun, biri aynı paket içinde bir şey yazıyorsa neyin ne olduğunu bilmesi gerekir zaten. Adamın gidip de "aa protected metod var lay lay kullanayım" diyecek hali yok. Üstteki mesajda dediğim gibi protected diye görüp de kullanmak pek olacak bir şey değil.

Ama bu olay mümkün olsaydı semantik açıdan çok yararlı olurdu bence. Kodu yada dökümanı okuyan adam signature'a bakarak hemen anlayabilirdi metodun sadece class ve subclass'lar için kullanılabileceğini. Bu da kolaylık sağlar sonuçta. Döküman okuyup da bu protected metodu paket içinden çağırmamın bir zararı var mı diye araştırman gerekmez.

[ Mesaj 28 Mayıs 2007, Pazartesi - 11:53 tarihinde, Mirage tarafından güncellenmiştir ]
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...