Multiple Inheritance

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

.NET developer

Functie Jij begint als .NET ontwikkelaar in een team met 10 andere Software Engineers. De werkzaamheden zijn afwisselend, zo kan het dat jij bezig bent met volledig nieuwe features of het door ontwikkelen van bestaande sites of shops. Wij ontwikkelen web applicaties, maar ook mobiele applicaties. Daarnaast bijt jij je soms ook van in externe koppelingen met systemen zoals een ERP. Als team is er een duidelijke focus m.b.t. het waarborgen van de performance en snelheid van webshops. Ook zijn wij expert op het gebied van configuratoren. Kortom enorm veel afwisselende werkzaamheden! Ook jouw werkplek kan afwisselend zijn. Soms heb

Bekijk vacature »

Junior .NET developer

Functie Als junior .NET Core developer wordt jij onderdeel van ons team met drie breed ontwikkelde software engineers en een flexibele schil met zes ervaren freelancers. Jij gaat mee in de visie van onze organisatie om als IoT partner in deze branche specifieke markt “het” platform te blijven innoveren en deze ook steeds slimmer te maken. Wij hopen dan ook zeker dit in de toekomst te kunnen realiseren met bijvoorbeeld Artificial Intelligence. De architectuur van ons platform is opgemaakt uit een deel eigen protocol, een interface laag en een laag welke de protocollen van derde partijen vertaald naar het eigen

Bekijk vacature »

.NET developer WO niveau voor predictive software

Bedrijfsomschrijving Dit bedrijf uit Den Bosch is om precies te zijn 15 medewerkers groot en ze ontwikkelen (predicitve) planning software. Dit doen zij voor allerlei mooie en bekende organisaties (bierbrouwerijen, gemeentes, oliemaatschappijen en diverse multinationals). Wegens meer en grotere vraag vanuit de klanten komen er nu posities vrij voor onder andere een .NET developer. Het bedrijf is goed met openbaar vervoer te bereiken. Functieomschrijving Je komt hier te werken in een team van 3 .NET developers en bent betrokken bij het gehele ontwikkelproces. Dus van idee naar ontwerp en van ontwikkeling tot testen en implementatie. Bij voorkeur ben je niet

Bekijk vacature »

Front end developer

Functie Binnen de functie van Front-end developer werk je mee aan uitdagende klantprojecten. In teamverband werk je aan de voorkant van onze state-of-the-art portaal oplossingen en apps. Dit alles gebeurt in een multidisciplinaire omgeving waarbij je de ruimte hebt om te sparren, je ideeën scherp te stellen, en waar je met de benodigde kennis en ervaring om je heen altijd terecht kunt bij je collega’s voor vragen en ondersteuning. Meestal werk je vanuit ons kantoor maar we bieden ook alle faciliteiten om thuis te kunnen werken. Voor sommige projecten ga je mee naar de klant, wellicht zelfs in het buitenland!

Bekijk vacature »

Informeel bureau zoekt Senior PHP developer

Functie Als senior PHP developer neem je het voortouw in ontwikkeltrajecten en ben je in staat werk uit te leggen aan collega’s om zo je kennis met hen te delen. Je deinst niet terug voor ingewikkelde projecten. Deze zie jij alleen maar als uit uitdaging. Je werkt doorlopend aan klantcases (en hierdoor je klant echt leert kennen), maar toch ben je afwisselend bezig. Dit alles in een vrije en ontspannen werksfeer, met een team van gelijkgestemde. Binnen de development teams werken ze met o.a. PHP, Laravel, React, Node, Elastic, Amazon AWS, JIRA, Solid, Domain-driven-design, Doctrine, Redis, docker, Kubernetes, CI, PHP

Bekijk vacature »

Database Developer

Functieomschrijving Wat ga je doen? Als developer ben jij samen met een gemotiveerd team van 10 collega’s verantwoordelijk voor het creëren van aangemeten software voor klanten. Je bent klantvriendelijk en oplossingsgericht ingesteld, omdat het essentieel is om de klanten zo goed mogelijk te helpen met hun uitdagingen. Het is mogelijk om vanuit huis je werkzaamheden uit te voeren, maar het is ook prettig als je in de omgeving van Tilburg woont om naar het kantoor te kunnen komen. Vind jij het leuk om jouw creatieve vaardigheden te benutten om complexe systemen te ontwikkelen? Lees dan snel verder! Bedrijfsprofiel Voor wie

Bekijk vacature »

Full stack developer Node.js

Functie Als fullstack JavaScript developer vind jij het uitdagend om op basis van concrete klantvragen nieuwe functionaliteiten te ontwikkelen. Bij voorkeur worden deze functionaliteiten op een bepaalde manier geprogrammeerd, zodat ze door meerdere klanten te gebruiken zijn. Je hebt dus vaak te maken met abstracte vraagstukken. Om dit te kunnen realiseren sta je nauw in contact met de product owner en/of klant. Je bent niet alleen onderdeel van het development team, maar hebt ook vaak contact met de product-owner en/of klanten om daardoor inzichten te verzamelen die leiden tot productverbeteringen. • Inzichten verzamelen bij de klant en/of product owner •

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 »

C# .Net Developer

Dit ga je doen Het bouwen van Api's; Nieuwe oplossingen bouwen met C# .Net; De huidige software uitbouwen met C# .Net; Meewerken in projecten; Meedenken aan de toekomstplannen en verbeteringen; Onderdeel van het Scrum Team. Hier ga je werken Onze klant is een dienstverlenende organisatie voor diverse soorten organisaties in Nederland. Ze zijn van oorsprong een familiebedrijf en er is een open cultuur. Ze zijn vooruitstrevend op IT gebied en hebben een eigen inhouse development team van circa 11 man. Je komt hier te werken in het subteam .Net Core. Hier werken ze volgens scrum met de nieuwste technieken en

Bekijk vacature »

.NET developer

Functie Voor jou als junior .NET ontwikkelaar staat er een flinke uitdaging klaar bij dit bedrijf waar jij veel van kan gaan leren. Zo willen zij een flinke uitbreiding doen op het webbased gedeelte dat zij nu hebben en willen zij het standaard deel gaan moderniseren. Jouw team is dan ook op zoek naar een junior .NET ontwikkelaar die het leuk vindt om op basis van research en development aan de slag te gaan. Jouw mening telt mee als het gaat om hoe en met wat deze applicaties gebouwd en herschreven gaan worden. Jouw functie bij dit bedrijf gaat dan

Bekijk vacature »

Software Developer

Dit ga je doen Je bent verantwoordelijk voor de warehouse applicatie die een integratie heeft met de PLC laag; Je ontwikkelt in C#/.Net; Je werkt mee aan de migratie naar .NET 6; Je bent verantwoordelijk voor het ontwikkelen van interfaces en het visualiseren van componenten; Je denkt mee over het design voor business oplossingen; Je bent verantwoordelijk voor het testen van de gebouwde oplossing. Hier ga je werken Voor een internationale organisatie in de transport zijn wij momenteel op zoek naar een Software Developer. Zij zijn wereldwijd de grootste speler en lopen voorop met het automatiseren van alle processen van

Bekijk vacature »

PHP Programmeur

Functieomschrijving Vanuit het hoofdkantoor in omgeving Breda, ontwikkel je als PHP programmeur niet alleen webapplicaties, maar ben je verder ook gefocust op het constant inspelen op nieuwe innovaties m.b.t software ontwikkeling. Naast het ontwikkelen van webapplicaties, bouwt deze toffe werkgever ook webshops en websites voor hun opdrachtgevers. Wat ga je doen? Het testen van ontwikkelde applicaties om te zorgen dat ze goed functioneren en voldoen aan de eisen van de klanten; Het ontwerpen en implementeren van webapplicaties met het Symfony framework; Het schrijven van een schone en efficiënte code volgens het Symfony framework; Onderhouden en updaten van bestaande applicaties die

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: 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 je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: 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 je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

SQL Database developer

Functie omschrijving Wil jij meewerken aan het creëren van slimme software om magazijnen als een geoliede machine te laten lopen? Wij zoeken een zorgvuldig persoon, iemand die niet snel de hand omdraait voor complexe algoritmes. Denk jij dat jij de SQL ontwikkelaar bent die wij zoeken? Lees snel verder en wie weet zitten we binnenkort samen aan tafel! Jouw werkzaamheden zullen er als volgt uitzien: Je houdt je bezig met het ontwerpen en ontwikkelen van MS SQL server databases, dit doe je met T-SQL als programmeer laag. Je gaat aan high-end software oplossingen werken, dit doe je voor de optimalisatie

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

05/11/2024 11:35:11
 
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.