Theory
કોણ cost price ને જોઈ શકે છે?
Mehta Uncle નો એક business secret એ cost price છે: શું તેણે soap માટે ચૂકવ્યું જે તે 40 પર વેચે છે. ShopKeeper એ તેને store કરવું જોઈએ (profit reports ને તેની જરૂર છે), પણ કોણ તેને read કરી શકે છે?
till form? હા: same project, family. કોઈ next year install કરે તે plugin DLL? bilkul નહીં.
Java એ તમને 4 access levels આપ્યા હતા જે class, package અને children પર keyed હતા. VB.NET પાસે પણ levels છે જે class, project અને children પર keyed છે, 2 renames અને 1 genuinely different meaning સાથે. differences એ છે જ્યાં exams aim કરે છે.
At a glance
5 doors, narrowest first
| Specifier | કોણ અંદર જાય છે | ShopKeeper use |
|---|---|---|
| Private | ફક્ત declaring class | _price backing field |
| Protected | ફક્ત class + derived classes | ભવિષ્યના DiscountedItem child માટે Helper |
| Friend | સમાન project (assembly) માં કંઈપણ | CostPrice: shop નું code, કોઈ બીજાનું નહીં |
| Protected Friend | Derived classes OR same project (union) | children અને in-house tools બંને માટે Hooks |
| Public | દરેક, દરેક જગ્યાએ | Name, Price, LineTotal |
Practical
Item જેના doors labelled છે
Public Class Item
Private _price As Decimal ' ફક્ત આ class
Friend CostPrice As Decimal ' આખું ShopKeeper project
Protected Sub MarkRepriced() ' હું + મારી derived classes
' DiscountedItem જેવા children માટે audit note
End Sub
Public Property Price As Decimal
Get
Return _price
End Get
Set(value As Decimal)
If value >= 0 Then _price = value
End Set
End Property
End Class
' Same project, till form માં: itm.CostPrice = 32D ' legal (Friend)
' Derived class જે MarkRepriced() ને call કરે છે ' legal (Protected)
' External DLL જે itm.CostPrice ને read કરે છે ' COMPILE ERROR: wrong assembly
' કોઈપણ: itm._price = 5 ' COMPILE ERROR: Private
Theory
2 renames અને 1 real difference
BCA403 ના Java થી mapping:
- Private અને Public: identical twins, કંઈ new નથી
- Friend Java ના package-private ની role play કરે છે, boundary assembly (compiled project, .exe અથવા .dll) પર drawn છે package folder ને બદલે
- Protected એ real difference છે: VB નું Protected ફક્ત derived classes ને admit કરે છે. Java નું protected આખા package ને ALSO admit કરતું હતું. Java ની definition ને VB answer માં carry કરવું એ access ને claim કરે છે જે exist નથી કરતું
- Protected Friend એ union છે (derived OR same assembly), જે land થાય છે closest ત્યાં જે Java નું protected actually હતું
Quiz
Item ના Friend member ને SAME ShopKeeper project ની બીજી class માંથી access કરવામાં આવે છે, જે Item થી inherit થતી નથી. શું થાય છે?
- Compile error: Friend ને inheritance relationship જોઈએ છે
- It works: Friend same project (assembly) માં કોઈપણ code ને admit કરે છે
- It works ફક્ત જો બીજી class same source file માં હોય
- Runtime security exception જ્યારે line execute થાય છે
Show the answer
It works: Friend same project (assembly) માં કોઈપણ code ને admit કરે છે
Friend ની boundary એ assembly છે: ShopKeeper project માં compiled દરેક class family છે, inheritance કે નહીં. Option A Protected ને describe કરે છે, neighbouring door, અને 2 ને mix up કરવું એ આ topic નો classic slip છે. Option C file rule ને invent કરે છે જે VB પાસે નથી; source-file layout ક્યારેય access ને affect નથી કરતું. Option D wrong phase છે: Java જેવું, BCA403 જેવું, access control entirely compile time પર settle થાય છે. One-line memory: Friend = my project, Protected = my children.
Think first
union door
Protected Friend 2 specifiers ને combine કરે છે. precisely work out કે કોણ આવા member ને access કરી શકે છે: yes cases ને list કરો અને એક important no case, પછી tap કરો.
Show the answer
Yes: same assembly માં કોઈપણ code (Friend half, inheritance જરૂરી નથી), AND કોઈપણ assembly માં derived classes (Protected half: બહારની DLL જે Item ને Inherits કરે છે તે પણ અંદર જાય છે). important no: different assembly માં unrelated class: neither family nor project, બંને doors shut. એ permissions નો OR છે, એટલે Protected Friend એ બંને parts કરતાં WIDER છે એકલા: Public પહેલાં widest door, અને જવાબ "કયો VB specifier Java ના protected જેવું behave કરે છે?"
Watch out
ત્રણ specifier slips
VB answer માં Java ના protected ને Quote કરવું: VB Protected બાકીના project ને include નથી કરતું; લખો "the class and its derived classes only".
Friend ને 2 classes વચ્ચે friendship તરીકે Read કરવું: તે C++ ની friend declaration નથી જે specific class ને name કરે છે; તે blanket same-assembly grant છે.
defaults ને Forget કરવું: class ની અંદર plain Dim field એ Private છે; specifier વગર declared class એ Friend છે. silence ના meanings છે; એને જાણો.
Theory
architect જેમ doors ને choose કરો
દરેક member માટે practical recipe જે તમે declare કરો છો: Private થી start કરો; Protected સુધી widen કરો ફક્ત જ્યારે child class genuinely તેને need કરે; in-project plumbing માટે Friend ને use કરો (CostPrice); Public ને તે surface માટે reserve કરો જે તમે happily document કરી શકો. એ progression IS encapsulation policy છે, અને pillar lesson 2 pages ahead તેને formally names કરે છે. next, though, come family pronouns: Me, MyBase અને એક જે Java ક્યારેય નહોતું, MyClass.
Summary
Key takeaways
- પાંચ specifiers: Private (class), Protected (class + ફક્ત derived), Friend (same assembly/project), Protected Friend (તે 2 નું union), Public (દરેક જગ્યાએ).
- Friend એ .NET નું package-private છે, assembly boundary પર drawn.
- VB Protected એ Java કરતાં NARROWER છે: ફક્ત derived classes, કોઈ project-mates નહીં.
- Protected Friend = Protected OR Friend: Java ના protected નો closest match.
- Access violations compile time પર fail થાય છે.
- Defaults: class માં Dim fields Private છે; unspecified classes Friend છે.
- Memory hook: Friend = my project, Protected = my children, Protected Friend = either.