Java është gjuha e parë që mësova në karrierën time. Struktura e saj është themelore në vitet e mia të para të të kuptuarit të koncepteve të programimit. Pasi kalova disa gjuhë të tjera me qasje shumë të ndryshme, unë e zgjerova këndvështrimin tim. Sot dua të reflektoj mbi idenë e trashëgimisë .
Trashëgimia në Java
Në Java, ideja e trashëgimisë është e lidhur ngushtë me konceptin e nëntipit . Nëntipi është zbatimi i një marrëdhënieje IS A. Për shembull, klasa Rabbit
është një nënlloj i klasës Mammal
. Tani e tutje, një shembull Rabbit
ka të gjithë sjelljen e një Mammal
: ai trashëgon sjelljen.
Për shkak të kësaj, ju mund të kaloni një shembull Rabbit
kur një metodë kërkon një parametër Mammal
ose të ktheni një shembull Rabbit
kur një lloj i kthimit të metodës është Mammal
. Nëse keni mësuar Java, .Net ose ndonjë gjë të ngjashme nga distanca, kjo është mënyra se si e shihni trashëgiminë dhe ajo bëhet normale e re.
Është trashëgimi e qartë .
class Animal { void feed(); } class Rabbit extends Animal { //1 }
- Për shkak se një
Rabbit
IS A
Animal
, ai mund tëfeed()
Trashëgimia në Go
Kur shikova për herë të parë Go, u habita që nuk kishte nëntipe, ndërkohë që ende ofron trashëgimi. Go përdor shtypjen e rosës:
Nëse duket si një rosë, noton si një rosë dhe shaka si një rosë, atëherë ndoshta është.
Nëse një struct
Go zbaton të njëjtat funksione si një ndërfaqe, ajo zbaton në mënyrë implicite ndërfaqen.
type Animal interface { feed() //1 } type Rabbit struct { } func (rabbit Rabbit) feed() { //2 // feeds }
- Një
Animal
mund të ushqehet - Për shkak se ekziston një funksion
feed()
që merr njëRabbit
si parametër,Rabbit
zbatonAnimal
Nuk më pëlqen Go për qasjen e tij të trajtimit të gabimeve, por kisha dy mendje për zbatimin e nënkuptuar. Nga njëra anë, kuptova se ishte një koncept i ri dhe u përpoqa të qëndroja mendjehapur; nga ana tjetër, mendoj se gjërat janë gjithmonë më mirë të qarta sesa të nënkuptuara, qoftë në zhvillimin e softuerit apo në jetën reale.
Trashëgimia në Python
Python është gjuha më interesante që njoh në lidhje me trashëgiminë.
Nëntipi dhe trashëgimia e bazuar në tip kanë qenë të pranishme në Python që nga fillimi i tij.
class Animal: def feed(self): #1 pass #2 class Rabbit(Animal): #3 pass
- Një
Animal
mund të ushqehet - Nuk ka klasa abstrakte dhe as ndërfaqe në Python, vetëm klasa
- Për shkak se një
Rabbit
IS A
Animal
, ai mund tëfeed()
Në këtë drejtim, Python funksionon njësoj si Java për sa i përket trashëgimisë. Python gjithashtu ofron shtypjen e rosës, të cilën e përshkrova si metoda magjike . Për shembull, për të bërë diçka të përsëritur , p.sh. , që mund të kthejë një përsëritës , ju duhet vetëm të zbatoni __iter__()
dhe __next__()
:
class SingleValueIterable(): done = False def __init__(self, value): self.value = value def __iter__(self): #1 return self def __next__(self): #1 if self.done: raise StopIteration else: self.done = True return self.value svi = SingleValueIterable(5) sviter = iter(svi) #2 for x in sviter: print(x) #3
- Metodat e shtypjes së rosës
- Krijo një
Iterator
- Pythons e di se si që kur ne kemi zbatuar metodat e mësipërme - Printo
5
Problemi me këtë qasje të shtypjes së rosës është se funksionon vetëm për metodat magjike të paracaktuara të Python. Po sikur të dëshironi të ofroni një klasë që një palë e tretë mund ta trashëgojë në mënyrë implicite?
class Animal: def feed(): pass class Rabbit: def feed(): pass
Në fragmentin e mësipërm, Rabbit
nuk është një Animal
, që na shqetëson shumë. Futni PEP 544 , të titulluar Protokollet: Nëntipi strukturor (shtypja statike e rosës). PEP zgjidh pamundësinë e përcaktimit të metodave magjike për klasat tona. Ai përcakton një klasë të thjeshtë Protocol
: pasi të trashëgoni prej saj, metodat e përcaktuara në klasë bëhen të pranueshme për shtypjen e rosës, prandaj emri - shtypje statike duck.
from typing import Protocol class Animal(Protocol): #1 def feed(): #2 pass class Rabbit: def feed(): #2 pass class VenusFlytrap: def feed(): #2 pass
- Trashëgimi nga
Protocol
- Për shkak se
Animal
është njëProtocol
, çdo klasë që përcaktonfeed()
bëhet njëAnimal
, për mirë ose për keq
konkluzioni
Programimi i orientuar nga objekti, trashëgimia dhe nëntipi mund të kenë kuptime specifike që nuk përkthehen në gjuhë të tjera, në varësi të gjuhës së parë që mësoni. Java e reklamon veten si një gjuhë e orientuar drejt objekteve dhe ofron paketën e plotë. Go nuk është një gjuhë OO, por gjithsesi ofron nënshtypje nëpërmjet shkrimit duck. Python ofron trashëgimi të qartë dhe të nënkuptuar, por jo ndërfaqe.
Ju mësoni një gjuhë të re programimi duke e krahasuar atë me atë që njihni tashmë. Njohja e veçorive të një gjuhe është çelësi për të shkruar kodin idiomatik në gjuhën tuaj të synuar. Njihuni me veçoritë që nuk ekzistojnë në gjuhët tuaja të njohura: ato do të zgjerojnë kuptimin tuaj të programimit në tërësi.
Shkoni më tej:
Botuar fillimisht në A Java Geek më 26 janar 2025