Ohjelmointikielet ja -paradigmat 5op Markus Norrena
Kotitehtävä 6, toteuttakaa alla olevan luokka ja attribuutit (muuttujat)
Kotitehtävä 6, toteuttakaa alla olevan luokka ja attribuutit (muuttujat) Huom! Kuvan metodeja ei tarvitse vielä tehdä! Luokaa luokka ja sen ilmentymät (oliot) Syöttäkää arvot ja tehkää ohjelma joka tulostaa nämä arvot näytölle. Palauttakaa koodinne Markukselle sähköpostitse.
Kotitehtävä 6:sta Miltä tuntui? Mitä syntyi? Kertokaa ellette saaneet koodia toimimaan, niin yritetään yhdessä saada kaikkien ohjelmat toimimaan. "mallivastaus": kotiteht06b.php
Inheritance / perintä Luokka voi periä toisen luokan ominaisuuksia (metodeja, attribuutteja) Perintä on tavallinen olio-ohjelmoinnin tekniikka, jossa uuden luokan lähtökohtana on aiemman luokan sisältö (parent child luokat). Periytyvyys = uusi luokka saa perusominaisuutensa toisesta luokasta ja siihen lisätään jotain
Inheritance / perintä "Inheritance: class definition with the word extends" esim: class CompactCar extends Car { }
Harjoitus Tehkää uusi luokka Auto joka sisältää attribuutit pyöriä (montako pyörää autossa on), jonka oletusarvo on 4 ovia (montako ovea on), jonka oletusarvo on 4 Ja metodin pyöriäovia (palauttaa auton pyörien ja ovien määrän yhteenlaskettuna)
Esim. <?php class Auto { public $pyöriä = 4; public $ovia = 4; } function pyöriäovia() { } return $this->pyöriä + $this->ovia;?>
Kokeilkaa toimivuutta <?php $car1 = new Auto(); echo $car1->pyöriä."<br />"; echo $car1->ovia."<br />"; echo $car1->pyöriäovia()."<br />";?>
Harjoituksen jatko Tehdään Auto-luokalle perillinen (lapsiluokka) "PieniAuto" Joka perii Auto luokan ominaisuudet Mutta jossa on vain 2 ovea
Esim. <?php class PieniAuto extends Auto { public $ovia= 2; }?>
<?php $car1 = new Auto(); $car2 = new PieniAuto(); Kokeillaan echo $car1->pyöriä."<br />"; echo $car1->ovia."<br />"; echo $car1->pyöriäovia()."<br />"; echo "<br />"; echo $car2->pyöriä."<br />"; echo $car2->ovia."<br />"; echo $car2->pyöriäovia()."<br />"; echo "<br />";?>
Kokeillaan työkaluja <?php echo "Auto parent: ".get_parent_class('auto')."<br />"; echo "PieniAuto parent: ".get_parent_class('pieniauto')."<br />"; echo is_subclass_of('auto', 'Auto')? 'true' : 'false'; echo "<br />"; echo is_subclass_of('pieniauto', 'Auto')? 'true' : 'false'; echo "<br />"; echo is_subclass_of('auto', 'PieniAuto')? 'true' : 'false'; echo "<br />"; echo is_subclass_of($car2, 'Auto')? 'true' : 'false';?>
Milloin käyttää perintää? Inheritance is a rule a car is a vehicle a bus is a vehicle a motorcycle is a bus an employee is a person
Perinnän estäminen: final ja const A parent class can prevent its methods from being overridden by its children with the final keyword class Vehicle { } final public function drive() { return "I'm drivin' here!"; }
Perinnän estäminen: final ja const We can set variables that don't change, these are prefixed with the const keyword (short for constant) class Immortal extends Person { } // Immortals never die! const alive = true;
Perinnän estäminen: final ja const PHP lets us set constants on a class-by-class basis This means we can have many constants with the same name, so long as they're all in different classes. We need to have some way of specifying which class we mean. We can use ::, the scope resolution operator, to specify which constant we want, like so:
Perinnän estäminen: final ja const class Immortal extends Person { // Immortals never die! } const alive = true; if (Immortal::alive) { echo "I live forever!"; } // Note that constants do not start with $.
Kapselointi (encapsulation) "Olion sisäisiin muuttujiin ei päästä suoraan käsiksi olion ulkopuolelta, jolloin ohjelmointivirheiden määrä vähenee." Olio-ohjelmointi mahdollistaa luotettavampaa koodia rajoittamalla sisäistä pääsyä attribuutteihin ja metodeihin Ns. "Access modifiers" Private / protected / public
Access modifiers Setting access to methods and attributes: public / private / protected Public = accessible from everywhere Private = only accessible internally from within this class Protected = accessible from this class or from its subclass Tämä ei siis koske ihmisten pääsyä koodiin, vaan koodin sisäistä rajoittamista
Kokeillaan class Example { public $a=1; protected $b=2; private $c=3; } function show_abc() { } echo $this->a; echo $this->b; echo $this->c; $example = new Example(); echo "public a:". $example->a."<br />"; //jne. b & c $example->show_abc();
Harjoitus Lisätkää edelliseen esimerkkiin perillinen, ja kokeilkaa mihin sillä on pääsy.
Kapselointi (encapsulation) Termillä tarkoitetaan myös "Datan ja käyttäytymisen kokoaminen yhteen yksikköön, olioon." siis pakataan asioita yhteen ja rajataan näkyvyys ja pääsy vain välttämättömään Johtaa parempaan koodiin.
Setters and Getters (design pattern) Setters and Getters (methods) Ei päästä suoraan käsiksi tietoon, vaan kuljetaan sitä mahdollistavan metodin kautta Yleensä kyse attribuuteista tai tietokantapääsystä "Ei päästä suoraan käsiksi rahaan, vaan kuljetaan pankkivirkailijan kautta" Pankkitiliesimerkissä voisi olla setter ja getter jotka tarkistavat onko tilillä tarpeeksi rahaa ennen nostoa Katsotaan esimerkkiä: access_modifiers2.php
access_modifiers2.php class SetterGetterExample { private $a=1; } public function get_a() { } return $this->a; public function set_a($value) { $this->a = $value; } $example = new SetterGetterExample(); // restricted: echo $example->a."<br />"; echo $example->get_a()."<br />"; $example->set_a(15); echo $example->get_a()."<br />";
Pankkitilit kotitehtävä 7 Toteuttakaa kotitehtävä 6:n kuvan mukaiset metodit open(), close(), deposit(), withdraw(), joilla voi Nostaa rahaa tililtä, Lisätä rahaa tilille, Sulkea ja aukaista tili Edellinen "mallivastaus" kurssisivulla Käyttäkää vastauksessanne kapselointia (private / protected / public) Kuva (UML-kaavio) :
Pankkitilit kotitehtävä
"Framework" kotitehtävä Miten etenee? Mitkä tavoitteet ensi kerraksi?