Waarom OO?!

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Software Developer

Longship.io gaat de wereld veroveren met baanbrekende software en legendarische... pizza-avonden! Lees hier de vacature van Software Developer! Bij Longship werken we met een team van 5 mensen aan software voor laadpaal operators. Longship is ontstaan in 2020 met als doel om de elektrische mobiliteitstransitie aan te jagen. We zijn nu al een wereldwijde speler doordat we continu voorop lopen in innovatie. Ons platform helpt het versneld elektrificeren van wagenparken, internationaal! Wij zijn een startup met grote ambities die we willen bereiken met een relatief klein en efficiënt team. Je krijg de kans om ontzettend veel te leren van ervaren

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 »

.NET Developer

Dit ga je doen (Door)Ontwikkelen van het applicatielandschap; (Door)Ontwikkelen van microservices; Bouwen van nieuwe functionaliteiten; Verbeteringen aandragen voor het applicatielandschap; Sparren met de business. Hier ga je werken De organisatie is werkzaam in de financiële dienstverlening met meer dan 200 medewerkers en meer dan 250.000 eindgebruikers is het een van de grotere binnen haar branche. Je komt te werken in een team waarmee je verantwoordelijk bent voor het ontwikkelen en onderhouden van de financiële applicaties binnen de organisatie, denk hierbij aan het bouwen en onderhouden van portalen. Als .net developer ga jij het development team ondersteunen met de transitie naar

Bekijk vacature »

C++ Ontwikkelaar

Functieomschrijving Ben jij als software ontwikkelaar toe aan een nieuwe uitdaging? Dan zoeken wij jou! Voor het maken van de procesbesturingssoftware gebruiken onze projectteams een in C++ en C# geschreven tool. Dit is een gedistribueerd object framework wat alle kernfuncties biedt voor een procesautomatisering. Verder zullen jouw werkzaamheden o.a. bestaan uit: Ontwerpen, programmeren en testen van product aanpassingen; Analyseren van vragen en wensen van gebruikers en deze vertalen naar een functioneel ontwerp; Inzichtelijk maken van voortgang omtrent softwarewerkzaamheden, o.a. door middel van SCRUM; Continu toetsen van het effect van nieuwe releases op andere tools en processen; Implementeren van nieuwe product

Bekijk vacature »

Fullstack developer

Functie omschrijving We are looking for a dutch native speaker Wil jij werken als Senior Developer en werken aan een applicatie die duizenden marketingcampagnes automatisch aanstuurt? Dit is je kans! Kom werken voor onze opdrachtgever en in deze rol zul je veel vrijheid en verantwoordelijkheid krijgen om gezamenlijk de applicatie naar een hoger plan te tillen. Wat ga je verder doen: Optimaliseren, beheren en uitbreiden van onze applicatie; Het bouwen van aansluitingen op de systemen van partners middels API’s; Meedenken over de technische/ontwikkel-standaarden; Proactief verbeterpunten voorstellen. Bedrijfsprofiel Het is een organisatie die met een team van verschillende developers én marketeers

Bekijk vacature »

Klein team zoekt grote fullstack .NET developer to

Bedrijfsomschrijving Deze werkgever is marktleider in de Benelux en is Europees ook al aardig aan de weg aan het timmeren. Ze voorzien technische winkels van apparatuur om producten een langer leven te geven. Hiermee reduceren ze flink wat CO2 uitstoot en dat is natuurlijk goed voor iedereen! IT speelt een belangrijke rol in de bedrijfsvoering en de applicaties zijn van goed niveau. Als fullstack .NET developer ga jij je bijdrage leveren aan het verder verbeteren van de applicaties en de interne processen. Ze zijn nu met ruim 50 medewerkers in totaal en de afdeling development bestaat uit een 5tal developers.

Bekijk vacature »

Senior Front-end Developer

Dit ga je doen Met behulp van diverse programmeertalen ontwikkelen van Front-end software; Het begeleiden van het front-end team; Het oplossen van incidenten; Het bijhouden van een backlog; Je hebt een actieve bijdrage in de wekelijkse overleggen met de omliggende teams; Je houdt trends bij en adviseert het management hierover waar nodig; Helder communiceren met de stakeholders om hen zo mee te nemen in projecten en laten inzien wat de duur en toegevoegde waarde van bepaalde projecten is. Hier ga je werken Deze organisatie heeft circa 40 miljoen bezoekers per maand en heeft innovatie hoog in het vaandel staan. Het

Bekijk vacature »

Ervaren C#.NET developer

Functieomschrijving We zijn op zoek naar een ervaren C#.NET programmeur voor een moderne werkgever in de regio Prinsenbeek. Als programmeur zal je bezig zijn met het ontwikkelen van op maat gemaakte webapplicaties voor verschillende klanten, waarbij je ervoor zorgt dat complexe processen zo goed mogelijk worden ondersteund. Je takenpakket omvat onder andere: Werken met databases en dataopslagoplossingen, implementeren van beveiligingsoplossingen en het waarborgen van de beveiliging van applicaties en gegevens, evenals het schrijven van technische documentatie en gebruikershandleidingen. Het ontwikkelen en onderhouden van C#.NET-applicaties. Bijdragen aan het ontwerp en de architectuur van softwaretoepassingen. Het schrijven van hoogwaardige en herbruikbare codes.

Bekijk vacature »

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

PHP Software Developer

Functie omschrijving Op zoek naar een nieuwe uitdaging binnen PHP? Lees dan snel verder! Wij zoeken een ervaren PHP developer die binnen een organisatie gaat functioneren als verlengstuk van de klant. Wij zoeken voor deze iemand die technisch complexe zaken met enthousiasme en plezier aanvliegt. Verder moet je instaat zijn om je tijd goed te managen omdat je aan meerdere projecten tegelijkertijd werkt. Je werkt met de nieuwste technieken en tijdens deze uitdaging werk je veel samen met de front-end developers van deze organisatie. Wij zoeken iemand die zichzelf graag uitdaagt en altijd de beste wilt zijn. Bedrijfsprofiel Waar ga

Bekijk vacature »

Randstad - Freelance Backend Developer/ Data Engin

Starting date: 10.05.2023 Salary range: €67,00 - €77,00 Duration: 6 months Hours: 40 Working model: Hybrid* MUST be NL based Job description: Our vision is to have a consistent and data driven experience for all sales across all our operating companies. Our mission is to enable our salespeople to be able to reach out to the right company at the right time. We do this by creating data driven micro services and solutions. We mainly focus on implementation in the Google Cloud but also integrate with local systems and other cloud solutions. A typical day: As a back-end developer you

Bekijk vacature »

Back end developer Digital agency

Functie Heb jij altijd al eens bij een bedrijf willen werken waar jij géén nummertje bent, die alleen maar uitvoerend werk doet? Dan zou je hier perfect passen! Tuurlijk, je werkt aan projecten voor grote of kleine bedrijven… Het enige verschil hier is, jouw mening telt hier écht. Jouw inbreng wordt gewaardeerd, serieus genomen en gebruikt. En vergeet niet, je werkt niet alleen aan deze projecten. Er werken in totaal ruim 20 developers en designers, onderverdeeld over 3 development teams. Voornamelijk bestaande uit Medior en Senior developers, die samen voor een inspirerende en ambitieuze omgeving zorgen. Hun visie is namelijk

Bekijk vacature »

C#.NET developer

Functieomschrijving Wij zijn op zoek naar een gepassioneerde Full Stack C#.NET Software Developer. Als Software Developer ben je verantwoordelijk voor het ontwikkelen van webapplicaties, apps en dashboards voor de eigen IOT-oplossingen. Je werkt samen met andere ontwikkelaars 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: Testen en valideren van de ontwikkelde software. Ontwikkelen en onderhouden van webapplicaties, apps en dashboards voor de eigen IOT-oplossingen. Je gaat aan de slag met diverse technologieën en frameworks. Denk hierbij aan C#, JS frameworks, HTML, CSS, TypeScript,

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 »

C# .NET Software Ontwikkelaar

Functie omschrijving C# .NET Developer gezocht. Ben jij een full stack developer die op zoek is naar een nieuwe uitdaging binnen een leuk snel groeiend bedrijf? Lees dan snel verder! Wij zijn op zoek naar een Developer met ervaring op het gebied van .NET die een organisatie in de regio Arnhem gaat versterken. Jij gaat je binnen dit bedrijf vooral bezighouden met het verbeteren van de functionaliteiten van hun dataplatform. Samen met andere ontwikkelaars denk je mee in oplossingsrichtingen, architectuur en nieuwe technologieën. Als C# .NET Developer binnen dit bedrijf houd je je niet alleen bezig met het verbeteren van

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

17/11/2024 09:26:50
 
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.