"Hej, Amigo! Vi er endelig kommet til noget virkelig interessant. I dag vil jeg fortælle dig om multipel arv . Multipel arv er virkelig et meget fascinerende og kraftfuldt værktøj. Og hvis det ikke var for flere problemer, så Java ville understøtte multipel nedarvning af klasser. Men det gør det ikke, så vi må nøjes med multipel nedarvning af grænseflader . Hvilket også er ret fantastisk."

Nedarvning af flere grænseflader - 1

Forestil dig, at du skriver et computerspil. Og dens karakterer (dine objekter) skal opføre sig på meget komplekse måder: gå rundt på et kort, saml genstande, udføre quests, kommunikere med andre karakterer, dræbe nogen, redde en anden. Lad os sige, at du har været i stand til at opdele alle objekterne i 20 kategorier. Det betyder, at hvis du er heldig, vil du kun kunne klare dig med 20 klasser til at definere dine objekter. Men her er fangsten: hvor mange unikke former for interaktion vil disse objekter have? Hver type objekt kan have unikke interaktioner med 20 andre typer objekter (vi tæller også interaktioner med objekter af samme type). Med andre ord skal du skrive kode for 20 x 20 = 400 interaktioner! Og hvis antallet af unikke objekttyper ikke er 20, men 100, så kan antallet af interaktioner være 10.000!

"Wow! Nu forstår jeg, hvorfor programmering er så vanskeligt arbejde."

"Det er enkelt. Takket være masser af abstraktioner. Og med en ikke ringe tak til flere grænseflader."

Vi kan ofte forenkle objektinteraktion, hvis roller og/eller evner interagerer frem for selve objekterne. Og som vi allerede ved, kan evner nemt tilføjes til en klasse, når den implementerer en eller anden grænseflade.

Når man skriver et stort program, gør udviklere normalt dette fra starten:

1) Identificer alle evner/roller.

2) Definer samspillet mellem disse roller.

3) Tildel derefter roller til alle klasserne.

"Måske et eksempel?"

"Selvfølgelig. Lad os se på roller i tegnefilmen "Tom og Jerry"."

Java kode Beskrivelse
interface Moveable
{}
— Rolle/evne til at bevæge sig.
interface Eatable
{}
— Rolle/evne til at blive spist.
interface Eat
{}
— Rolle/evne til at spise nogen.
class Tom extends Cat implements Moveable, Eatable, Eat
{}
Tom er en kat, der har tre roller:
1) Han kan bevæge sig
2) Han kan spise nogen
3) Han kan blive spist af nogen (en hund)
class Jerry extends Mouse implements Moveable, Eatable
{}
Jerry er en mus, der har to roller:
1) Han kan bevæge sig
2) Han kan blive spist af nogen
class Killer extends Dog implements Moveable, Eat
{}
Killer er en hund med to roller: 1) Han kan bevæge sig 2) Han kan spise nogen

Når du kun kender disse tre roller (grænseflader), kan du skrive et program og beskrive den korrekte interaktion mellem disse roller. For eksempel vil en genstand jage (via Moveable-grænsefladen) efter «den du kan spise» og løbe væk fra «den, der kan spise dig». Og alt dette uden at vide om specifikke objekter. Hvis du tilføjer flere objekter (klasser) til programmet og beholder disse roller, vil det stadig fungere smukt og kontrollere dine objekters adfærd.