Multiple Inheritance

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Front-End Developer

Als Front-End Developer bij Coolblue verbeter je de gebruiksvriendelijkheid van onze webshop voor miljoenen klanten. Wat doe je als Front-End Developer bij Coolblue? Als Front-end Developer werk je aan de gebruiksvriendelijkheid van onze webshop voor miljoenen klanten. Je vindt het leuk om samen te werken met de UX designer om stories op te pakken. Je krijgt energie van het bedenken van creatieve oplossingen en presenteert dit graag binnen het team. Daarnaast ben je trots op je werk en verwelkomt alle feedback. Ook Front-end Developer worden bij Coolblue? Lees hieronder of het bij je past. Dit vind je leuk om te

Bekijk vacature »

Android developer

De functie Schiphol is een plek om te reizen, te verblijven en te werken. Door middel van data en technologie richten we op al deze gebieden het leef- en werkklimaat optimaal in en zorgen we voor een slimmere en efficiëntere operatie. Wij ontwikkelen nieuwe producten en diensten vanuit de wensen en behoeften van onze klanten, voorspellen passagier flows en testen digitale oplossingen om rijen en andere pijnpunten in het proces te verminderen. Met slimme feedback van sensortechnologie maken we zelfs data van toiletten en stoelen inzichtelijk en bruikbaar. Het Commercial Platform bestaat uit multidisciplinaire teams met een end-2-end verantwoordelijkheid voor

Bekijk vacature »

Front end ontwikkelaar

Functie Het huidige team bestaat uit momenteel uit 5 back end developers verdeeld van senior tot junior. Omdat de gehele front end van applicaties anders gaan insteken zijn ze op zoek naar een ervaren Front end developer die hen kan helpen de juiste keuzes te maken. Je krijgt veel vrijheid om te bepalen hoe je dit wilt ontwikkelen en vrijheid in welke techniek je hiervoor wilt gebruiken. Je zult je dus bezighouden met architectuur, documentatie en natuurlijk ontwikkeling van nieuwe functionaliteiten binnen de verschillende applicaties. natuurlijk heb jij ook mogelijkheden om te sparren binnen het team, maar ze gaan uit

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

Bekijk vacature »

Ambitieuze medior developer

Wat je gaat doen: Heb jij al een paar jaar ervaring als developer maar wil jij naar the next level? In ons NextLevelDev Programma helpen wij jou om de volgende stap te zetten: een mooi programma aan trainingen op het gebied van Java, hippe frameworks, Agile/Scrum, OCP-certificering en optioneel: andere JVM-talen als Kotlin en Scala; Cloud (AWS, Azure, GCP) Soc Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun

Bekijk vacature »

Senior Front-end developer Consultancy

Functie Als front-end developer ga je aan de slag voor verschillende klanten, waarbij veel rekening wordt gehouden met waar je woont (dit is altijd binnen het uur), en word er gezocht naar een organisatie die past bij jou. Zowel qua persoonlijke ambities als de technische aansluiting. De opdrachten duren gemiddeld 1 à 2 jaar maar dit hangt ook af van je wensen. Je werkt in een teamverband voor een klant en zult nauw samenwerken met zowel eigen collega’s als die bij de klant werkzaam zijn. Ze zijn op zoek naar een technische front-end developer die ruime ervaring heeft in één

Bekijk vacature »

C#.NET Developer Jr. Functie

Functie omschrijving Bouw jij graag aan applicaties om processen in distributiecentra te optimaliseren? Wij zijn op zoek naar een C#.NET ontwikkelaar in regio Breda die hier graag een steentje aan bijdraagt! Jouw werkzaamheden zullen er als volgt uitzien: Je krijgt veel vrijheid in de keuze van de technieken die je gaat gebruiken. Uiteraard wel binnen de gestelde kaders, en door gebruik te maken van het .NET platform. Je gaat aan de slag met de ontwikkeling van een nieuwe module binnen de WMS suite van dit bedrijf. Deze "carrier" module gaat er voor zorgen dat de selectie van een vervoerder volledig

Bekijk vacature »

Fullstack Software Developer

Functieomschrijving Voor een ambitieuze werkgever in regio Roosendaal zijn wij op zoek naar een Full Stack C#.NET Developer. Als software programmeur ben je verantwoordelijk voor het bouwen van webapplicaties, apps en dashboards voor de eigen IOT-oplossingen. Je werkt samen met andere developers en engineers om de sensoren in machines uit te lezen en deze data om te zetten in management informatie voor jullie klanten. Taken en verantwoordelijkheden: Verder ontwikkelen en onderhouden van webapplicaties, dashboards en apps voor de eigen IOT-oplossingen; Testen en goedkeuren van de software; Je gaat aan de slag met de volgende technologieën en frameworks: C#, JS frameworks,

Bekijk vacature »

PHP Developer

Functieomschrijving Wij zijn op zoek naar een PHP Developer met Laravel ervaring! Voor een groeiende werkgever in regio Breda zijn wij op zoek naar een medior PHP developer met Laravel ervaring. Je gaat aan de slag met het ontwikkelen van maatwerk software voor klanten in een specifieke markt. Als PHP developer ben je samen met een gemotiveerd team van 6 collega’s verantwoordelijk voor de ontwikkeling, beheer en het innoveren van informatiesystemen voor klanten in een specifieke branche. Als software developer ondersteun je complexe uitdagingen van klanten. Je brengt hun wensen in kaart en vertaalt deze door naar maatwerk software. Om

Bekijk vacature »

Low code Developer

Dit ga je doen Je richt je op het doorontwikkelen van bestaande applicaties en het geheel van scratch af aan opzetten van nieuwe applicaties binnen een low code platform; Je beoordeelt technisch ontwerpen en maakt de vertaalslag naar de technische oplossingen binnen het platform; Je voert testwerkzaamheden uit; Je adviseert de organisatie op jouw vakgebied; Je schakelt met business analisten en de architect om tot mooie oplossingen te komen; Je lost bugs op en denkt mee over een structurele oplossing. Hier ga je werken Het gaat om een bekend internationaal handelsbedrijf met ruim 800 medewerkers, verdeeld over verschillende deelbedrijven. Deze

Bekijk vacature »

Senior .NET developer

Functie Als Senior .NET ontwikkelaar ga jij aan de slag in ons Research & development team. Ons team bestaat uit 17 collega’s! Wij zijn momenteel druk bezig met het opzetten van een geheel nieuwe architectuur voor een nieuw product. Hierbij maken wij o.a. gebruik van VS2022 en .NET 6.0. Jouw functie is dan ook voornamelijk backend georiënteerd bij ons. Aangezien wij meetapparatuur ontwikkelen voor de chemische industrie is het ook erg belangrijk om kwalitatief hoogwaardige software te ontwikkelen voor de besturing hiervan. Verder ben jij verantwoordelijk voor het designen, implementeren en testen van nieuwe features. Ook zorg jij voor toekomstbestendige

Bekijk vacature »

Software Developer Java

Java/Kotlin Developer Ben jij een ervaren Java/Kotlin developer met een passie voor het automatiseren van bedrijfsprocessen? Wil je graag deelnemen aan uitdagende projecten bij aansprekende klanten? En ben je op zoek naar een professioneel, ambitieus en dynamisch bedrijf om je carrière verder te ontwikkelen? Kom dan ons team bij Ritense in Amsterdam versterken! Zo ziet de functie eruit: Als Java/Kotlin developer bij Ritense ben je verantwoordelijk voor de ontwikkeling en implementatie van applicaties die bedrijfsprocessen automatiseren, zodat onze klanten slimmer, efficiënter en klantgerichter kunnen werken. Als developer ben je in de lead en zorg je voor de correcte oplevering van

Bekijk vacature »

Lead Webdeveloper

Als Lead webdeveloper bij KUBUS ben je verantwoordelijk voor het implementatie design van requirements en de software architectuur van de webapplicatie en services van BIMcollab. In je rol als lead developer zoek je als vanzelf op een creatieve manier naar het optimum tussen benodigde implementatie-tijd, de performance van de applicatie en een snelle go-to-market van features, aansluitend bij onze geautomatiseerde test- en release train. Hierbij bewaak je in samenwerking met de andere senior ontwikkelaars in je team de architectuur van de applicatie en adviseer je de product owner over noodzakelijke refactoring om de onderhoudbaarheid van het platform te verbeteren. Ons

Bekijk vacature »

Senior Front end developer Digital Agency

Functie Jij als Front end developer komt te werken in een van de 8 multidisciplinaire teams binnen de organisatie. Deze teams werken op basis van Scrum agile in 2 wekelijkse sprints. De grootte van de teams varieert van 9-14 collega’s en bestaan altijd uit één of meerdere project managers en een project manager. Samen met je team werk je aan verschillende projecten voor uiteenlopende klanten zoals grote multinationals tot het kleine mkb. De stack waarmee gewerkt wordt is voornamelijk Javascript, ES6, Es.next, HTML, CSS, React.js en Node.js. Wat deze organisatie onderscheid is dat ze echt langdurige partnerships aangaan met hun

Bekijk vacature »

PHP Developer - medior functie

Functieomschrijving Ben jij innovatief en wil jij je kennis graag delen met jouw nieuwe collega's? Lees dan snel verder! Voor een leuke opdrachtgever in de omgeving van Roosendaal zoeken wij een Symfony developer. Of je nou junior, medior of senior bent, je krijgt hier alle vrijheid en verantwoordelijkheid om jouw eigen loopbaan te ontwikkelen. Je gaat je hier bezig houden met en inspelen op de actualiteiten van jouw vakgebied. Techstack: Symfony, PHP, mySQL. Kennis van Svelte is helemaal mooi meegenomen. Bedrijfsprofiel Al sinds '99 is dit webbureau actief. De kernwaarden binnen het bedrijf zijn integer, dienstbaar en deskundig. Je komt

Bekijk vacature »
Hank Noseman

Hank Noseman

11/06/2013 13:57:35
Quote Anchor link
Ik heb een classe voor normale wegvoertuigen en een classe voor watervoertuigen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
class Autovoertuig
class Watervoertuig


Nu heb ik een classe Amfibievoertuig (waterauto) die gebaseerd moet zijn op beide bovenstaande classes, zoiets als dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
class Amfibievoertuig extends Autovoertuig, Watervoertuig


Echter lees ik dat php geen multiple inheritance ondersteund.

Weet iemand een workaround?
 
PHP hulp

PHP hulp

23/12/2024 08:03:42
 
Erwin H

Erwin H

11/06/2013 14:33:24
Quote Anchor link
Een workaround niet, een oplossing wel. Wat je zal moeten doen is je classe structuur anders opbouwen en dan de functionaliteit onderbrengen in aparte classes. Die classes (en functionaliteit) kan je dan door je voertuig classes laten gebruiken. Zo kan een auto gebruik maken van de 'rij' functionalieit, maar ook het amfibie. De 'vaar' functionaliteit kan door een boot worden gebruikt en ook weer door een amfibie.
Dit wordt ook wel het strategy design pattern genoemd: http://en.wikipedia.org/wiki/Strategy_pattern
 
Wouter J

Wouter J

11/06/2013 14:37:13
Quote Anchor link
Wat staat er precies in de klassen Autovoertuig en Watervoertuig? Naar mijn mening werkt een amfibievoertuig anders dan een auto of watervoertuig en hoort het daarom niet over te erven van deze klassen. Ik zou dan iets als dit doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
interface VoertuigInterface;
interface DrijfbaarVoertuigInterface extends VoertuigInterface;
interface RijdbaarVoertuigInterface extends VoertuigInterface;

abstract class StuurbaarVoertuig implements VoertuigInterface;

class AutoVoertuig extends StuurbaarVoertuig implemets RijdbaarVoertuigInterface;
class WaterVoertuig extends StuurbaarVoertuig implements DrijfbaarVoertuigInterface;
class AmfibieVoertuig extends StuurbaarVoertuig implements RijdbaarVoertuigInterface, DrijfbaarVoertuigInterface;




Het strategy pattern had ik nog niet aan gedacht, is ook een mooie oplossing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
interface WaterGedrag;
interface VasteGrondGedrag;
interface VoertuigInterface;

class DrijfGedrag implements WaterGedrag;
class ZinkGedrag implements WaterGedrag;
...

class RijGedrag implements VasteGrondGedrag;
class SchuifGedrag implements VasteGrondGedrag;
...

class Voertuig implements VoertuigInterface;

En dan in gebruik:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$auto
= new Voertuig();
$auto->setVasteGrondGedrag(new RijGedrag());
$auto->setWaterGedrag(new ZinkGedrag());

$boot = new Voertuig();
$boot->setVasteGrondGedrag(new SchuifGedrag());
$boot->setWaterGedrag(new DrijfGedrag());

$amfibie = new Voertuig();
$amfibie->setVasteGrondGedrag(new RijGedrag());
$amfibie->setWaterGedrag(new DrijfGedrag());
?>
Gewijzigd op 11/06/2013 15:01:08 door Wouter J
 
Hank Noseman

Hank Noseman

11/06/2013 16:29:34
Quote Anchor link
Bedankt voor de reacties. Ik bedoel eigenlijk zoiets als onderstaande. Volgens mij is zoiets wel mogelijk in Delphi en ik zoek een workaround in PHP.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Autovoertuig
{
  function GaVooruit()
  {
  }
}
class Watervoertuig
{
  function GaVooruit()
  {
  }
}

class Amfibievoertuig extends Autovoertuig, Watervoertuig
{
 public IsModusAutoOfBoot;
 function GaVooruit()
 {
    if (IsModusAutoOfBoot=='auto')
    {
       Autovoertuig.GaVooruit;
    }
    elseif (IsModusAutoOfBoot=='boot')
    {
       Watervoertuig.GaVooruit;
    }

 }
}
 
Ward van der Put
Moderator

Ward van der Put

11/06/2013 16:54:30
Quote Anchor link
Vanaf PHP 5.4.0 kun je multiple inheritance nabootsen met multiple traits.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
trait Rijden
{
    // ...
}

trait Varen
{
    // ...
}

class Amfibievoertuig
{
    use Rijden, Varen;
    // ...
}
?>


Als je echter, zoals in jouw opzet, één gedeelde methode GaVooruit() hebt die bij 'boot' anders reageert dan bij 'auto', dan heb je meer twee klassen die afstammen van één en dezelfde ouderklasse. Dan krijg je eerder dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class Amfibievoertuig
{
    // Kan varen én rijden.
}

class Auto extends Amfibievoertuig
{
    // Kan alleen rijden.
}

class Boot extends Amfibievoertuig
{
    // Kan alleen varen.
}
?>


Je kunt dus omgekeerd redeneren: een auto is een amfibievoertuig dat niet kan varen en een boot is een amfibievoertuig dat niet kan rijden.
 
Erwin H

Erwin H

11/06/2013 17:10:59
Quote Anchor link
Om eerlijk te zijn lijkt dat laatste me een zeer foute manier. Want je hebt ook nog treinen, die rijden op een spoor. Maar sommige vrachtwagens die aan het spoor werken hebben ook de mogelijkheid om op het spoor te rijden. Dus nu moet je dan al een nog grotere basisklas hebben die ook op het spoor kan rijden zodat je die vrachtwagens die op het spoor kunnen rijden hiermee ook kunt bouwen.

Zo krijg je het vliegende rubber eendjes verhaal, voor degene die het boek kennen. Niet doen op die manier.

Toevoeging op 11/06/2013 17:12:15:

Hank Noseman op 11/06/2013 16:29:34:
Bedankt voor de reacties. Ik bedoel eigenlijk zoiets als onderstaande. Volgens mij is zoiets wel mogelijk in Delphi en ik zoek een workaround in PHP.

Simpel, die is er dus niet.
 
Ward van der Put
Moderator

Ward van der Put

11/06/2013 17:24:48
Quote Anchor link
Erwin, ik ging ervan uit dat het niet echt over amfibievoertuigen of badeenden gaat :)

Het logicaprobleem bij multiple inheritance is dat je een vader en een moeder hebt die beide anders lopen: ze hebben beide een methode GaVooruit(). Dat betekent dat je een kind altijd voor een keuze stelt: loop je zoals vader, zoals moeder of zoals een mengelmoes?

Met multiple traits LopenAlsEenMan en LopenAlsEenVrouw los je dat deels op.

Het alternatief is niet elegant, dat ben ik met je eens, maar dat is inherent aan het ontbreken van multiple inheritance in PHP: je bouwt beide varianten van de methode in en laat een afgeleide klasse de methode kiezen.

Zo ongebruikelijk is dat overigens natuurlijk niet: in veel constructors kun je immers ook kiezen welke "smaak" je van een klasse wilt hebben.
 
Erwin H

Erwin H

11/06/2013 17:30:36
Quote Anchor link
En daarom is het strategy patern juist zo mooi. Daarmee bereik je precies hetzelfde, het is veel flexibeler en je voorkomt dat functionaliteit op een rare manier achter blijft daar waar je het niet wil hebben.
 
Ward van der Put
Moderator

Ward van der Put

11/06/2013 17:47:14
Quote Anchor link
Erwin H op 11/06/2013 17:30:36:
En daarom is het strategy patern juist zo mooi. Daarmee bereik je precies hetzelfde, het is veel flexibeler en je voorkomt dat functionaliteit op een rare manier achter blijft daar waar je het niet wil hebben.
Goed punt. Wat vind je dan van gedeelde functionaliteit in gemeenschappelijke traits die je expliciet moet aanroepen met use?
 
Erwin H

Erwin H

11/06/2013 17:56:00
Quote Anchor link
Met traits heb ik nog te weinig ervaring om daar een mening over te geven. Ik ga daar zo wel even naar kijken, maar meer uitleg van jouw kant (hoe traits hierbij een rol kunnen spelen) waardeer ik wel.
 
Ward van der Put
Moderator

Ward van der Put

11/06/2013 18:13:00
Quote Anchor link
Ik denk dat de zoektocht naar een passende naam al veelzeggend is. Een trait is een kenmerk, maar hadden we daarvoor in ruil al niet de property of eigenschap en de function voor bepaalde functionaliteit?

Eerlijk gezegd heb ik zo mijn bedenkingen. Traits kunnen dingen doen die ik liever niet terugzie in een grootschalig project.

Neem bijvoorbeeld deze uitbreiding op een vorig voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
trait Rijden
{
    // ...
}

trait Varen
{
    // ...
}

trait Vliegen
{
    // ...
}

class Amfibievoertuig
{
    use Rijden, Varen, Vliegen;
    // ...
}
?>


Met één simpele uitbreiding van use Rijden, Varen, Vliegen kan het amfibievoertuig plotseling ook vliegen. En die trait Vliegen geeft de klasse meteen alle methoden van de trait.

Is dat nu handig of gevaarlijk? Ik weet het niet, de waarheid zal ongetwijfeld ergens in het midden liggen.
Gewijzigd op 11/06/2013 18:13:46 door Ward van der Put
 
Erwin H

Erwin H

11/06/2013 19:19:59
Quote Anchor link
Als ik zo een beetje rondlees (zonder er dus echt diep in duiken) dan krijg ik het gevoel dat traits echt alleen interessant zijn om code op 1 plek te krijgen die je op meerdere plekken nodig hebt. Op zich zou dit dus wel een juiste omstandigheid zijn. Tegelijkertijd krijg ik alleen ook het gevoel dat traits een probleem oplossen dat je alleen krijgt door een niet optimaal design. Dubbele code kan je, denk ik, beter proberen te vermijden door je klassen structuur anders te ontwerpen. Maar inderdaad, de waarheid zal ongetwijfeld genuanceerder zijn en in een halfuurtje rondsnuffelen kom ik natuurlijk ook niet alles te weten over traits.
 
Wouter J

Wouter J

11/06/2013 19:45:15
Quote Anchor link
Hank, ik hoop dat geen 1 OO taal multiple inhertiance toestaan. Het is naar mijn mening iets wat een verkeerd design aangeeft, of in elk geval geen optimaal design. Het boek waar Erwin naar refereert heeft een paar handige OO principes, eentje daarvan is "Verkies compositie boven overerving". Ik denk dat dit zo'n geval is waar je dit principe moet toepassen, je hebt veel te snel de neiging om overerving te gebruiken terwijl je weet dat het z'n beperkingen heeft en uitbereiding tegenhoudt.

Erwin & Ward, ik heb jullie hele discussie niet volledig gelezen, maar naar mijn mening horen traits niet thuis in de OO klassen. Traits zijn mooi in de "niet-OO klassen", zoals een Controller of Command class.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.