Ez late-binding?
Sziasztok!
Szeretném ha valaki elmondaná, hogy mi zajlik a háttérben.A 8. sor lenne a kérdés. Második kérdésem, hogy ezt Java-ban hogyan kell megvalósítani. (PHP 7.0.8)
Köszönöm!
■ Szeretném ha valaki elmondaná, hogy mi zajlik a háttérben.
<?php
interface contact {
public function getSign();
}
class post_office {
public function send_message($recpt, $message) {
$signature = $this->getSign();
return $recpt . " " . $message . " " . $signature;
}
}
class post extends post_office implements contact {
public function getSign() {
return "Joe Dow" . PHP_EOL;
}
}
$post = new post();
$recpt = 'Gipsz Jakab';
$message = "Hello!" . PHP_EOL;
echo $post->send_message($recpt, $message);
Köszönöm!
A post_office nem hívhatná
post_office
nem hívhatná meg a$this->getSign()
-t mivel nem implementálja. És pont ezért Java-ban le sem fog fordulni. Legalábbabstract
osztálynak kellene lennie apost_office
-nak, hogy meg lehessen adni agetSign
fejlécét.abstract OK
Abstract
Miért?
Composition over inheritance
PirosAuto extends Auto
ezt vonja magával:this.super = new Auto()
Vagyis a PirosAuto classba írt kódod csak a konkét Auto osztállyal együtt fog működni.
De mi a helyzet, ha a kódod felhasználójának már van egy Zsiguli példánya, aminek beállította a felnijeit meg a bőrülésket, és most szeretné használni a te pirosító kódodat? A Zsiguli is autó, viszont a te kódod csak az ősosztályt hajlandó példányosítani, fittyethányva az ő kedvenc Zsigulijára, amin olyan sokat dolgozott.
Ha viszont az öröklődéssel szemben komponálunk (például a Decorator minta alkamazásával), akkor a PirosAuto paraméterként várja azt az autót, aminek funkcionalitását kiterjeszteni hivatott.
Ha szeretnéd, hogy a PirosAuto átadható legyen-e Auto-t váró függvényeknek, akkor az Auto egy interfész lesz, amit a PirosAuto implementál. Az egyetlen hátrány, hogy a nyelv nem fogja mágikusan behelyezni a felül nem írott metódusokat az új osztályodba, mint ahogy öröklődésnél teszi. Itt neekd kell wrapperekben meghívnod az "ős" metódusait, még akkor is ha nem szeretnél változtatni azok működésén. - De egy valamire való IDE egyből legenrálja neked ezeket a funkciókat, egy valamire való runtime pedig eloptimizálja a +1 "call" CPU utasítást.
Azt azért érdemes lenne
Overengineering
Can you elaborate pls? ;-)
Sok
Én bátran ajánlom mindnekinek, 10 esetből kilencszer jobban fogsz járni kompozícióval, mint örökléssel, ha szükséged van polimorfizmusra. (Ugyanezt tudom mondani egy DI konténerre new-zás helyett, és így tovább).
Publikus adatot meg publikus apiban használni (legalább is olyan nyelvekben, ahol nem létezik a property intézménye) kevés jó okból lehet. Az Android APIban elhiszem, hogy okkal döntöttek így egykét helyen, egy webshopban vagy játékban nem igazán tudok ilyen okot elképzelni.
A szakma jelenlegi siralmas helyzetében egy diszklémert írni egy tervezési minta bemutatása után csak arra jó, hogy alabit adjon annak, aki nem hajlandó semmi újat tanulni.
(Elnézést, kicsit érzékenyen érint a téma).
Csak arra akartam rámutatni,
Nem teljesen értem, mire
Nagyjából erről van szó a
Öröklődés helyett kompozíciót szoktak használni:
Ezen az úton kellene elindulni örököltetés helyett.
Köszi a terjedelmes példát,
Viszont tartom azt a véleményt, hogy van értelme az absztrakciónak és nem olyan ördögi dolog, ha arra használja az ember, amire való (pl.: strategy pattern, általános entitások vagy bármilyen más osztályok kiterjesztése esetén, ahol az ősből nincs értelme példányt készíteni).
Szerintem sok vitát szűlt már hasonló kérdéses dolog, hogy egy adott témakörben két alternatív lehetőség közül melyiket érdemesebb alkalmazni. Sokszor azt veszem észre, hogy mindenkinek igaza lehet, kérdés, hogy egy adott megoldás milyen kontextusban állja meg a helyét.
Pl.: objektum orientált programozás vs funkcionális programozás; mindegyik lehet jó választás és rossz választás is; viszont, hogy adott esetben melyik a jó azt szerintem a probléma dönti el; pl.: üzleti alkalmazás vs komplex matematikai alkalmazás esetén az asszociáció egyértelmű (szerintem).
Múltkor sikerült részt vennem egy témájában viszonylag OFF beszélgetésben itt Weblaboron, most nem szeretném ebbe az irányba elvinni ezt a beszélgetést. Ha van értelme folytatni ezt a szálat, akkor azt javaslom nyissunk egy új témát.
Na örülök, akkor ezzel a
Szerintem is probléma függő, hogy mi a legjobb megoldás, vagy akár több jó megoldás is lehet. Jó lenne erről többet beszélni, mint állandóan egyik vagy másik megoldást sulykolni.