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ë .
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 }
Rabbit
IS A
Animal
, ai mund të feed()
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 }
Animal
mund të ushqehetfeed()
që merr një Rabbit
si parametër, Rabbit
zbaton Animal
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.
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
Animal
mund të ushqehetRabbit
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
Iterator
- Pythons e di se si që kur ne kemi zbatuar metodat e mësipërme5
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
Protocol
Animal
është një Protocol
, çdo klasë që përcakton feed()
bëhet një Animal
, për mirë ose për keqProgramimi 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