Waarom OO?!

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Full Stack Developer

Dit ga je doen Ontwikkelen van Product Informatie Management (PIM) systemen; Werken aan zowel grotere als kleine projecten voor toonaangevende klanten binnen o.a. de retail; Verantwoordelijk voor de front-end werkzaamheden; Naast de front-end werk je ook aan de backend. Hier ga je werken Als Full Stack Developer komt je te werken binnen een vooruitstrevende organisatie die Product Informatie Management (PIM) systemen levert aan hun klanten. Hun klanten zijn toonaangevende bedrijven binnen o.a. de retail. De organisatie zit gevestigd in regio Zwolle en bestaat uit zo'n 35 medewerkers, waarvan 30 IT. Je komt te werken binnen één van de zelfsturende development

Bekijk vacature »

Software Developer Mendix / Maatschappelijk Betrok

Dit ga je doen Het bouwen van de Mendix applicaties in samenwerking met jouw team of zelfstandig; Werken met Scrum methodiek; Ontwikkelen van vooruitstrevende oplossingen; Meedenken over nieuwe applicaties en ontwikkelingen; On the job eigen maken van de Mendix omgeving. Hier ga je werken Deze dynamische en snelgroeiende organisatie begeeft zich in de recyclingbranche. Zij nemen op duurzame en efficiënte manier de recycling op zich. Vanwege hun snelle groei zijn zij op zoek naar een young professional die zich graag wilt ontwikkelen als Mendix Developer. Je komt te werken binnen een IT team van +/- 15 medewerkers. Het huidige ‘vaste’

Bekijk vacature »

IT Manager team PaaS

TenneT is hard groeiende om haar ambities waar te kunnen maken. Zo nemen wij een leidende rol in het aanjagen van de energietransitie. Het werven van nieuw talent speelt daarin een cruciale rol. Wij zijn op zoek naar een gedreven Lead PaaS die hieraan wil bijdragen en misschien ben jij dat wel? Jouw bijdrage aan TenneT Je wordt de Teammanager (Lead) van een nieuw team binnen de afdeling Basic van Information Technology and Facilities (ITF) van TenneT. Het team heet Platform as a Service. Hier wordt elke dag in een goede sfeer met zijn allen hard gewerkt om vanuit IT

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 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. Ze zijn wereldwijd de grootste speler en lopen voorop met het automatiseren van alle processen van de warehouses. Op dit moment wordt er nog gebruik

Bekijk vacature »

Digitale Tovenaar Gezocht: Junior Low-code/No-code

Bedrijfsomschrijving Duik mee in een wereld vol innovatieve avonturen waar gegevens en technologie een magische symbiose aangaan! Al meer dan twee decennia lang zijn we de tovenaars achter de schermen die oplossingen creëren voor de meest complexe klantcontactvraagstukken en datagedreven software-uitdagingen. Bij ons draait het om de kracht van samenwerking en groei. We zijn een hechte vriendengroep die samen bergen verzet om elkaar én onze klanten te laten schitteren. Jouw succes is ons succes en we streven ernaar om elkaar naar nieuwe hoogten te tillen, niet voor even, maar voor altijd. We willen dat jij je helemaal thuis voelt in

Bekijk vacature »

Back end developer Digital Agency

Functie Wij zijn van origine een wordpress bureau, maar sinds 2006 zijn wij dit wel redelijk ontgroeid. Naar mate de jaren verstreken zijn we gegroeid in omvang, maar ook in de complexiteit van opdrachten waarin wij onze klanten kunnen bedienen. Momenteel bestaat onze organisatie uit 4 front end developers, 12 back end developer 3 projectmanagers en een 2 koppig management. Wij zijn een hele informele, bijna familiaire organisatie. Geen strak pak of overhemd, nee gewoon dragen waar jij je prettig bij voelt. De gemiddelde leeftijd ligt tussen de 25 en 30 en wij doen er veel aan om onze hechte

Bekijk vacature »

Software Ontwikkelaar PHP

Functie omschrijving Full Stack Software Ontwikkelaar gezocht! Voor een bedrijf in de regio van Ermelo zijn wij op zoek naar een Software Ontwikkelaar die gaat bijdragen aan het door ontwikkelen, onderhouden en optimaliseren van SaaS applicatie van dit bedrijf. Hierbij ga jij voor- en samenwerken met de klanten van de organisatie, het is hierbij dus van groot belang dat je communicatief vaardig bent en dat je beschikt over beheersing van zowel de Nederlandse als Engelse taal. Bedrijfsprofiel Waar ga je werken? Altijd al in een echt familiebedrijf willen werken? Dan is dit je kans! Het bedrijf waar je komt te

Bekijk vacature »

Robot Programmeur

Een verantwoordelijke baan met leuke uitdagingen. Heb jij ervaring met het programmeren van robots? Kan jij goed samenwerken met collega's die verschillende specialisaties hebben? Ben je oplossingsgericht, analytisch en flexibel? Ga dan aan de slag als Robot Programmeur bij Gibas in Nijkerk! Als Robot Programmeur kom je te werken bij Gibas. Dat betekent dat je gegarandeerd meewerkt aan unieke oplossingen in productieprocessen. Bij elk project moet er opnieuw geëngineerd en geprogrammeerd worden. Dat maakt jouw werk uitdagend! Voordat je robots gaat programmeren komt er het volgende bij kijken: De opdracht gaat van de afdeling Sales naar de afdeling Operations door

Bekijk vacature »

Oracle Developer / PL SQL

Dit ga je doen Software ontwikkeling aan een internationaal gebruikt pakket; Werken met technieken als Oracle 19c, Toad, PL/SQL, Oracle Forms, Reports en Designer; Meedraaien in internationale projecten; Meedenken over technisch en functioneel ontwerp; Samenwerken met collega's als Informatie Analisten, Testers en Release Managers; Soms wensen en eisen afstemmen met de business. Hier ga je werken Onze klant, een internationaal bekend bedrijf dat essentiële producten maakt waar iedereen graag gebruik van maakt, zoekt versterking in het Software Development team. Samen met 3 developers, een release manager, een informatie analist en 3 testers werk jij aan een systeem waarmee complexe producten

Bekijk vacature »

Medior/senior front end developer

Functie Vanwege de groei binnen het bedrijf zijn we op zoek naar versterking in het development team. Als back-end developer bouw je aan de bedrijfssoftware die ons helpt bij de primaire processen. Een leuk (intern) project dus waarbij je de software continu doorontwikkeld! Je werkt in een klein team, we hebben dagelijks stand-ups en iedere twee weken een scrum-sessie, begeleid door onze Scrum Master. Hierin krijg je uitgebreid de kans om je ideeën te presenteren, en te overleggen met je mede-ontwikkelaars en de Product Owner. Binnen de ontwikkelteams gebruiken we Trello, Gitlab, Jiira, Confluence en Boockstack. Hiernaast werken ze met

Bekijk vacature »

Full Stack Developer/ Applicatie Ontwikkelaar

Wat jij doet Als Applicatie Ontwikkelaar ben je onderdeel van het team die de Rimote omgeving ontwikkeld en onderhoud. Hierbij kan je denk aan de cloud, on premise en webapplicaties welke worden gebruikt in bijvoorbeeld industriële bakkerijen, biogasinstallaties en kwekerijen. Deze applicaties verzorgen (remote) de aansturing en monitoring van processen, machines en robots. Van a tot z ben je betrokken bij projecten. Dit betekent vanaf ontwerp tot oplevering. Je moet samen met jouw team een goed product neer zetten. Dit begint met het opzetten van het ontwerp. De basis van de software moet staan als een huis. Daarvoor moet jij

Bekijk vacature »

SAP HANA Cloud Application Developer

Vacature details Vakgebied: Software/IT Opleiding: Senior Werklocatie: Veldhoven Vacature ID: 12662 Introductie HANA Cloud Application Developer at a High Tech company. The company is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. This role is situated in the Big Data Analytics (BDA) Domain. The teams have mixture of young talent and senior specialists and have a

Bekijk vacature »

Java Developer

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 »

Java Developer

Functie Wat ga je doen als Java developer? Jij komt terecht binnen een informeel team waarin je verantwoordelijk bent voor de backend systemen voor grote klanten als Ziggo en KPN. Als Medior Java developer werk je in teamverband en soms individueel. Gedurende de werkweek zal je veelvuldig sparren met je collega’s voor een goede implementatie van de software. Ben jij een echte Java developer? Ben je geïnteresseerd in de nieuwste technieken en de laatste ontwikkelingen? Dan ben je hier aan het juiste adres! Eisen Wat wordt er van jou verwacht? • Minimaal HBO/WO denk- en werkniveau; • Analytisch sterk, open

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 »

Pagina: « vorige 1 2 3 volgende »

Ozzie PHP

Ozzie PHP

28/11/2013 01:19:08
Quote Anchor link
Reshad F op 28/11/2013 00:39:19:
Hier geef ik je de tip om wanneer mogelijk een interface te gebruiken omdat je waar mogelijk moet programmeren naar een interface en niet naar een implementatie toe.

Reshad, waarom is dit? Kun je dat eens uitleggen? Mij lijkt het juist handig om een abstracte class te gebruiken omdat de constructor en class property telkens hetzelfde zijn. Het enige dat verschilt is de validate functie. De rest is idem. Is dan een abstracte class niet handiger?
 
PHP hulp

PHP hulp

29/04/2024 14:36:37
 
Ward van der Put
Moderator

Ward van der Put

28/11/2013 07:39:05
Quote Anchor link
Ozzie PHP op 28/11/2013 01:19:08:
Mij lijkt het juist handig om een abstracte class te gebruiken omdat de constructor en class property telkens hetzelfde zijn. Het enige dat verschilt is de validate functie. De rest is idem. Is dan een abstracte class niet handiger?

Hier hoort validate() juist in de interface. De interface schrijft voor dat alle implementaties de methode validate() moeten hebben, maar niet hoe die wordt ingevuld.

Een abstracte klasse gebruik je vooral voor gedeelde of gemeenschappelijke standaardcode. Dat is in dit geval dan niet validate(), want die methode verschilt per klasse.
 
Dos Moonen

Dos Moonen

28/11/2013 08:57:01
Quote Anchor link
Je kunt een abstract class maken die de interface implementeert.

Als jij type hint op een abstract class, dan MOET het een instantie van een child van die class zijn.
Als jij type hint op een interface, dan kan het een instantie van elke class zijn ZOLANG het die interface maar implementeert.

In beide gevallen zal het werken.
 
Ozzie PHP

Ozzie PHP

28/11/2013 11:27:29
Quote Anchor link
>> Hier hoort validate() juist in de interface. De interface schrijft voor dat alle implementaties de methode validate() moeten hebben, maar niet hoe die wordt ingevuld.

Dat doet een abstract class toch ook? De hele class is verder precies hetzelfde, alleen de validate method verschilt per class, dus die maak je dan abstract. Als je een interface gebruikt ga je telkens dezelfde code opnieuw schrijven, terwijl je als een abstracte class gebruikt de childs alleen maar een validate method hoeven te hebben. Daar is een abstract class toch voor bedoeld? Als je gebruikmaakt van een interface, dan maakt het niet uit hoe de classes eruit zien, zolang ze maar de methods uit de interface ondersteunen. Bij een abstract class is de class feitelijk al klaar, alleen de abstracte methods, in dit geval de validate method, moeten nog worden ingevuld door de childs. Dat is dan toch een logischere oplossing dan een interface in dit geval?
 
Ward van der Put
Moderator

Ward van der Put

28/11/2013 11:40:36
Quote Anchor link
Nee, in een abstract class zijn de methoden vaak al gebruiksklaar. De validate() is er dan al in alle afgeleide klassen en die moet dus ook al functioneren. In een abstract class kan een methode zelfs final zijn en dan kán een child class niet eens meer een andere validate() implementeren. Moet elke child class echter een eigen validate() implementeren, dan dwing je de aanwezigheid daarvan af in een interface.

Je kunt inderdaad in de abstract class een validate() opnemen die door child classes mag worden overschreven. Maar dan is onduidelijk of dat ook moet. Dat kun je enkel in de interface afdwingen.
 
Ozzie PHP

Ozzie PHP

28/11/2013 12:03:28
Quote Anchor link
Ward, ik snap 'm even niet...

http://php.net/manual/en/language.oop5.abstract.php

Quote:
Methods defined as abstract simply declare the method's signature - they cannot define the implementation.

When inheriting from an abstract class, all methods marked abstract in the parent's class declaration must be defined by the child.

Hier staat dat abstracte methods juist geen functionaliteit mogen bezitten en moeten worden ingevuld door de child class. Dat lijkt niet overeen te komen met wat jij zegt "Nee, in een abstract class zijn de methoden vaak al gebruiksklaar.", of ik begrijp je verkeerd.
 
Ward van der Put
Moderator

Ward van der Put

28/11/2013 12:23:20
Quote Anchor link
Een abstract class kun je niet instantiëren: je kunt er geen objecten mee maken. Maar je kunt er wel degelijk standaardmethoden in onderbrengen. Je kunt ze zelfs final maken, zodat child classes allemaal dezelfde implementatie gebruiken.

Even een voorbeeld. We hebben "een betaalmethode", maakt niet uit welke. Daarvoor hebben we altijd een te betalen bedrag $Amount nodig. En aangezien we sowieso nu al een bedrag hebben, voegen we voor de volledigheid een getAmount() toe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
abstract class AbstractPayment implements PaymentInterface
{
    protected $Amount;

    final public function getAmount()
    {

        return $this->Amount;
    }
}

?>

Dat bedrag moet er nog in als we een object maken. Alleen hanteren verschillende betaalmethoden verschillende bedragen. De verplichte aanwezigheid van een setter setAmount() formaliseren we in de interface:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
interface PaymentInterface
{
    public function setAmount($amount);
}

?>

Hiermee hebben we een prototype dat altijd een bedrag $Amount heeft, dat altijd met de universele getAmount() kan worden opgevraagd en dat altijd met een unieke setAmount() moet worden ingesteld. Daarmee kunnen we tot slot verschillende betaalsystemen ondersteunen, bijvoorbeeld iDEAL voor bedragen van € 0,84 t/m € 10.000 en MrCash voor bedragen van € 0,49 t/m € 5.000:
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
<?php
class iDEALPayment extends AbstractPayment
{
    public function setAmount($amount)
    {

        if (is_int($amount) && $amount >= 84 && $amount <= 1000000) {
            $this->Amount = $amount;
        }
else {
            throw new Exception('Invalid iDEAL amount.');
        }

        return $this;
    }
}


class MrCashPayment extends AbstractPayment
{
    public function setAmount($amount)
    {

        if (is_int($amount) && $amount >= 49 && $amount <= 500000) {
            $this->Amount = $amount;
        }
else {
            throw new Exception('Invalid MrCash amount.');
        }

        return $this;
    }
}

?>
 
Dos Moonen

Dos Moonen

28/11/2013 12:26:23
Quote Anchor link
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php

interface Moveable
{

    function
goTo(Loation $location);

}


interface Location
{
    public getLattitude();
}


abstract class Car implements Moveable
{

    abstract function goTo(Location $destination);

    abstract function startEngine();

}


class Bike implements Moveable
{
    public goTo(Location $location)
    {
        ...
    }
}

function
driveTo(Car $car, Location $location)
{

    return $car->goTo($location);
}

function
goTo(Moveable $object, Location $location)
{

    $object->moveTo($location);
}


driveTo(new Bike, new Home); // werkt niet
goTo(new Bike, new Home); // werkt wel

?>


Interfaces zijn flexibeler. Interfaces zijn meer future proof. Als ik was begonnen met een abstract Car class zonder interfaces, en later blijk een class Bike ook nodig, dan zal ik moeten refactoren. Als ik meteen een interface had gebruikt hoefde ik alleen maar de classe Bike aan te maken.
Gewijzigd op 28/11/2013 12:40:38 door Dos Moonen
 
Ozzie PHP

Ozzie PHP

28/11/2013 12:44:21
Quote Anchor link
@Dos: oké, ik snap wat je bedoelt en in die zin kan het inderdaad handig zijn.

@Wouter: duidelijk voorbeeld! Ik snap alleen niet waarom je dan de setAmount method niet als abstracte method opneemt in de abstract class:

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
abstract class AbstractPayment implements PaymentInterface
{
    protected $Amount;

    abstract public function setAmount();

    final public function getAmount()
    {

        return $this->Amount;
    }
}

?>

Wat is het verschil met een interface? Ik grijp weer even terug naar de uitleg op php.net

"all methods marked abstract in the parent's class declaration must be defined by the child"

Ofwel, de abstracte methods in de parent class (in jouw voorbeeld setAmount) moeten worden ingevuld door de child class. Wat is nu het verschil met een interface? :-s
 
Dos Moonen

Dos Moonen

28/11/2013 13:03:06
Quote Anchor link
Interface methods MOETEN public zijn. Dat is een eigenschap van interfaces.
Interface methods zijn ook altijd impliciet abstract methods.

Abstract methods kunnen public of protected zijn, private kan niet.

Methods die in een child/interface al als abstract gedefineerd zijn hoef je in een abstract class niet nogmaals te defineren. Het kan wel, zolang het maar precies de zelfde signature heeft.

"all methods marked abstract in the parent's class declaration must be defined by the child" geldt voor classes die niet abstract zijn.
 
Ozzie PHP

Ozzie PHP

28/11/2013 13:09:53
Quote Anchor link
Dos, laat ik m'n vraag anders stellen. Waarom wordt in het voorbeeld met phonenumber gesteld dat je beter een interface kunt gebruiken dan een abstracte class? Als de child class de abstract class extends dan is de child class al zo goed als klaar. Dan hoef je daar alleen de validate method in te zetten. Terwijl als je geen gebruik maakt van een abstract class en de child class een interface laat implementeren, dan moet je de hele class opnieuw opbouwen. Dat verschil snap ik niet. Wanneer maak je een method abstract? Mijn gedachte: wanneer deze method ook moet voorkomen in de child class.
 
Reshad F

Reshad F

28/11/2013 13:31:29
Quote Anchor link
In zowel een abstracte klasse als een interface is het zo dat de child klasses die hier gebruik van maken de (abstracte)methoden moeten implementeren.

Even een heel simpel voorbeeldje.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
interface pizza {
    
    public function prepare();
    public function bake();
    public function slice();
    public function serve();
}


class funghiPizza implements pizza {

    private $ingredients;

    public function __construct($ingredients) {

// minimaal een paar ingredienten meegeven want van alleen 1 ingredient kunnen we geen pizza maken. :p
        if(is_array($ingredients)){

            foreach ($ingredients as $ingredient) {
                $this->ingredients[] = $ingredient;
            }


            return $this->ingredients;

        }

        else {
            throw new InvalidArgumentException('No error given: ' . $ingredients);
            return false;
        }

    }


    public function prepare() {
        $this->gooihetindeblender();
    }


    public function bake() {
        // etc
    }    

    public function slice() {
        // etc
    }

    public function serve() {
        // etc
    }

}


abstract class pizza {

    public function __construct($ingredients) {
        // minimaal een paar ingredienten meegeven want van alleen 1 ingredient kunnen we geen pizza maken. :p
        if(is_array($ingredients)){

            foreach ($ingredients as $ingredient) {
                $this->ingredients[] = $ingredient;
            }


            return $this->ingredients;

        }

        else {
            throw new InvalidArgumentException('No error given: ' . $ingredients);
            return false;
        }

    }


    public function prepare() {

        $this->gooiErEierenIn();

    }


    public abstract function bake();
    public abstract function slice();
    public abstract function serve();

}


class rarePizza extends pizza {

    public function __construct() {
        parent::__construct();
    }


    public function bake() {

    }


    public function slice() {

    }


    public function serve() {

    }

}




?>


Zoals je hier zit kan ik bij de interface welke pizza dan ook maken en alles gebruiken en doen of laten wat ik ermee wil. Bij de abstracte klasse wordt dit al gauw beperkt omdat in dit geval de prepare methode bepaalt hoe een pizza gemaakt wordt en naar mijn idee hoort een pizza anders gemaakt te worden dan een andere pizza. Het gebruik van interfaces is beter dan een abstracte klasse te gebruiken omdat je meer controle hebt over wat een child klasse moet doen.

Hier wil ik niet mee zeggen dat een abstracte klasse nu de boeman is en niet gebruikt moet worden want ook deze heeft zijn voordelen maar dat hangt af per geval. Een abstrace klasse zou ik eerder gebruiken wanneer ik bijvoorbeeld een klasse person maak en dan een klasse Werknemer die bijv setName, getName etc moet overerven

Toevoeging op 28/11/2013 13:33:40:

Ozzie PHP op 28/11/2013 13:09:53:
Dos, laat ik m'n vraag anders stellen. Waarom wordt in het voorbeeld met phonenumber gesteld dat je beter een interface kunt gebruiken dan een abstracte class? Als de child class de abstract class extends dan is de child class al zo goed als klaar. Dan hoef je daar alleen de validate method in te zetten. Terwijl als je geen gebruik maakt van een abstract class en de child class een interface laat implementeren, dan moet je de hele class opnieuw opbouwen. Dat verschil snap ik niet. Wanneer maak je een method abstract? Mijn gedachte: wanneer deze method ook moet voorkomen in de child class.


Moet het bij een interface dan niet voorkomen in de childklasse? ( Jazeker wel ) alleen is de vrijheid die je hierbij krijgt dat jij het aan de child overlaat hoe hij/zij deze invult en niet de implementatie klakkeloos overneemt zie mijn voorbeeld hierboven.
 
Ward van der Put
Moderator

Ward van der Put

28/11/2013 13:35:16
Quote Anchor link
Een methode uit een interface kun je niet implementeren als een abstracte methode. Probeer het maar en voeg abstract public function setAmount($amount); toe:

Fatal error: Can't inherit abstract function PaymentInterface::setAmount() (previously declared abstract in AbstractPayment)

Het voorbeeld werkt dan alleen nog als we de interface overboord gooien. Het lijkt daarmee een keuze en dan verkies ik de interface. Je kunt anders helemaal geen interface meer implementeren. Je zit vast aan een extends van de abstracte klasse, ook als je geheel andere klassen wilt bouwen met dezelfde interface.

Op dat laatste komt het aan: de interface formaliseert slechts de API van klassen, een abstracte klasse is al gedeeltelijk een implementatie.
Gewijzigd op 28/11/2013 13:35:45 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

28/11/2013 13:52:54
Quote Anchor link
Pfff, lastig dit.

@Reshad: terug naar jouw pizza voorbeeldje dan. Ik zou zeggen dat iedere pizza in een restaurant op dezelfde manier wordt gebakken, gesliced en geserveerd. Bij het bakken verschilt hooguit het aantal minuten, maar het in stukken snijden en het serveren gebeurt op dezelfde manier. Ik ga er vanuit dat alle pizza's door een ober worden geserveerd en dat niet een pizza margherita ineens door een olifant wordt opgediend. In mijn optiek zijn de methods bake, slice en serve dus onderdeel van de abstract class. Aan de functie prepare moet per pizza een eigen invulling worden gegeven dus die maken we abstract. Dan krijgen we dus 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
17
18
19
20
21
22
23
24
25
26
27
<?php

abstract class pizza {

    protected $ingredients;

    public function __construct($ingredients) {
      // set the ingrediënten als class properties
    }

    abstract public function prepare(); // de prepare method verschilt per pizza, dus abstract!

    public function bake() {
      // stop de pizza in de oven en bak 'm
    }

    public function slice() {
      // snij de pizza in stukken
    }

    public function serve() {
      // serveer de pizza
    }

}


?>

En dan de pizza zelf:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

class PizzaSiciliana extends Pizza {

    public function prepare() {
      // bereid de pizza voor
    }

}


?>

Dit is toch hoe het zou moeten?????

(P.S. je kunt geen waarden returnen in een constructor zoals jij in je voorbeeld doet)

Toevoeging op 28/11/2013 13:55:39:

Ward van der Put op 28/11/2013 13:35:16:
Je kunt anders helemaal geen interface meer implementeren. Je zit vast aan een extends van de abstracte klasse, ook als je geheel andere klassen wilt bouwen met dezelfde interface.

Maar de vraag is in hoeverre het instellen van een telefoonnummer of een amount beschouw moet worden als een interface, of als onderdeel van de blauwdruk van de class. Dat vind ik nogal lastig te bepalen. Als ik jouw redenatie volg dan zouden er in jouw abstracte classes nooit abstracte methods te vinden zijn.
 
Dos Moonen

Dos Moonen

28/11/2013 13:57:26
Quote Anchor link
@ward Het werkt prima op ondersteunde PHP versies:
http://sandbox.onlinephpfunctions.com/code/6fb652c5c012313514cff127b8a556293f69ede4
5.3.3 geeft die foutmelding van jou, 5.3.10 (er zit niets tussen) slikt het wel.
PHP 5.3 is niet meer ondersteund en negeer ik persoonlijk lekker.
 
Ozzie PHP

Ozzie PHP

28/11/2013 13:58:14
Quote Anchor link
Op deze link: http://stackoverflow.com/questions/1913098/what-is-the-difference-between-an-interface-and-abstract-class

Quote:
Abstract classes look a lot like interfaces, but they have something more : you can define a behavior for them. It's more about a guy saying "these classes should look like that, and they got that in common, so fill in the blanks!".

Dat is wat ik bedoel. De hele class om het telefoonnummer of de betaling of de pizza in te stellen of maken is er al. Je moet alleen even de gaten opvullen, ofwel die ene method: setPhoneNumber, setAmount, of preparePizza.
 
Ward van der Put
Moderator

Ward van der Put

28/11/2013 14:03:44
Quote Anchor link
Dos Moonen op 28/11/2013 13:57:26:
@ward Het werkt prima op ondersteunde PHP versies:
http://sandbox.onlinephpfunctions.com/code/6fb652c5c012313514cff127b8a556293f69ede4
5.3.3 geeft die foutmelding van jou, 5.3.10 (er zit niets tussen) slikt het wel.
PHP 5.3 is niet meer ondersteund en negeer ik persoonlijk lekker.
Oh, fijn is dat. Was dat een ordinaire bug? Of meer een ongelukkige keuze voor de gelijktijdige implementatie van een abstracte klasse en een interface?
 
Dos Moonen

Dos Moonen

28/11/2013 14:15:56
Quote Anchor link
Ward van der Put op 28/11/2013 14:03:44:
Dos Moonen op 28/11/2013 13:57:26:
@ward Het werkt prima op ondersteunde PHP versies:
http://sandbox.onlinephpfunctions.com/code/6fb652c5c012313514cff127b8a556293f69ede4
5.3.3 geeft die foutmelding van jou, 5.3.10 (er zit niets tussen) slikt het wel.
PHP 5.3 is niet meer ondersteund en negeer ik persoonlijk lekker.
Oh, fijn is dat. Was dat een ordinaire bug? Of meer een ongelukkige keuze voor de gelijktijdige implementatie van een abstracte klasse en een interface?

Niet verder gezocht dan dat. Ik vermoed een ongelukkige keuze.
 
Ozzie PHP

Ozzie PHP

28/11/2013 14:31:37
Quote Anchor link
Kunnen jullie aub nog reageren op mijn 2 voorgaande berichten?
 
Erwin H

Erwin H

28/11/2013 14:36:59
Quote Anchor link
Ozzie PHP op 28/11/2013 13:52:54:
@Reshad: terug naar jouw pizza voorbeeldje dan. Ik zou zeggen dat iedere pizza in een restaurant op dezelfde manier wordt gebakken,

Nee, je kan bijvoorbeeld denken aan de pizza's in de pizzahut. Daar heb je steen oven pizza's en pan pizza's. Niet hetzelfde dus, gaan niet door hetzelfde proces.
Ozzie PHP op 28/11/2013 13:52:54:
gesliced

Nee, een pizza calzone snijdt je niet in stukken, die serveer je als geheel.
Ozzie PHP op 28/11/2013 13:52:54:
en geserveerd.

Nee, een afhaal pizza wordt niet geserveerd, maar in een doos gepropt en afgegeven.

Met andere woorden, hier wil je een interface gebruiken, omdat alle pizza's in essentie dezelfde stappen doorlopen, maar zeker niet op dezelfde manier. Een absbtracte klasse heeft dus geen toegevoegde waarde.
Gewijzigd op 28/11/2013 14:37:51 door Erwin H
 

Pagina: « vorige 1 2 3 volgende »



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.