Autor Zpráva
Koudis
Profil *
Ahoj, mám malí problém .... v jedné skupině tříd mám návrh. vzor FACTORY ... mám
tedy hlavní třádu např AUTO .... v třídě auto mám statickou metodu která mi
načte daný objekt pod autem (napr mercedes) a vrátí tento vytvořený objekt ...
problém je vtom že se mi z třídy AUTO vrací objekt jiného tzpu nežli je AUTO ..
potřeboval bzch nějak přetypovat( mám tídu ve které porovnámám pomocí instanceof
AUTO ... potřeboval bych tento model --> předělat až v podledním tažení :)... )
ten vrácený objekt na AUTO .. jde to nějak ??:
díky moc za rady...
Alphard
Profil
Můžete ukázat konkrétní kód, kde vytváříte danou instanci?
Moc nechápu tu větu která mi načte daný objekt pod autem (napr mercedes). Co je objekt pod autem, třída auto, jiná třída (interface, extends)?
Vzor faktory by snad měl vracet instanci správného typu, jinak bude chyba v návrhu aplikace.
Nox
Profil
Mercedes je objekt nebo třída? Pokud objekt a Auto je Factory pak nechápu proč takto a ne přes konstruktor?
Pokud by to byla třída, pak je jasné že je to instanceof Mercedes a ne Auto....tedy primárně, nevim jestli instanceof bere taky rodiče
Koudis
Profil
Alphard:
mercedes je jenom druh auto, samostatná třída...
... mám třídu AUTO (exmp), v té třídě mám statickou metodu Start(), v metodě Start volám konstruktor mercedesu a vracím ho (return new mercedes(blblblbl ...);)... takže zavolám $a = AUTO::Start(); proměnná $a je tedy typu mercedes a ne typu AUTO ... já potřebuji $a přetypovat na AUTO...
Nox
Profil
exmp?

To je podle mě nesmysl, to bys musel nějakým způsobem konvertovat třídu....když vytvoříš objekt třídy mercedes tak je to objekt třídy mercedes....

To co chceš má 2 významy - buď se změní jen to jak se bude objekt hlásit: to je pak spíš špatně, proč by měl lhát? Anebo se změní jeho struktura - vlastnosti, metody....a v tom jednak nevidím žádný smysl a druhak by musel být nějaký konverzní algoritmus, nevim, nějak se mi ten záměr nelíbí a celý ten koncept mi přijde divný (tak jak to (ne)chápu)
Koudis
Profil
tam jde o to že uživatelé používají pro vytvoření jednotlivích instancí třídu AUTO (neznají přesné názvy tříd)... ta vrátí různé objektz podle požadavku ... ale představme si žebychm chtěli zjistit je-li daný objekt tzpu AUTO (tedz byl vyvolán v AUTO)... takovým jednoduchým řešením se mi zdálo přetypování jekéhokoliv objektu vytvořeného v AUTO, přetypovat na AUTO. JDE NĚJAK PŘETYPOVAT OBJEKT V PHP ? ..díky za rady :)
Alphard
Profil
Jak píše Nox, jestliže to má projít přes instanceof AUTO, měla by to být pravda. Pokud vám na tom nezáleží, tak tu podmínku můžete rovnou smazat, není k ničemu.
Má-li to být pravda, měla by být třída mercedes takto (jedno z řešení):

interface Auto
{
}

class Mercedes implements Auto
{
}

$mercedes = new Mercedes;

if($mercedes instanceof Auto);  // mělo by být splněno
Koudis
Profil
Alphard:
to mě napadlo taky ... mám tam právě abstract třídy(z důvodů ...) a nechci tam cpát interface, ale myslím že to tam asi nakonec udělám ... myslel jsem že v PHP jde nějak jednoduše přetypovat(jenom příslušnost, ne vlastnosti atd :)) ... ale asi ne :)... dík za radz :)
Nebo možná nastavit ty názvy tříd jako globalní konstanty(bude jich hodně ale aspon tam nebude interface) a pak porovnávat ty kontstaty, pak by to interface odpadlo ...
WertriK
Profil
Zdravím,
pokud to chápu dobře, proč to neudělat následovně: ?

class Auto {
$otyp = "";
$obj = "";

if ($pozadavek == "mercedes") {
 $otyp = "mercedes";
 $obj = new Mercedes();
}

}

$vuz = new Auto("mercedes");

if ($vuz->otyp == "mercedes") {
...
}
Koudis
Profil
WertriK:
hmm .. to vypadá dobře ... celkem nepřehledné bude volání např $vuz->obj->metodaVracejíciDalsiOBj()->proměnná ... ale zase je to lepší než interface a konstanty :) .. díky moc za radu
Alphard
Profil
Koudis:
mám tam právě abstract třídy(z důvodů ...) a nechci tam cpát interface
S nimi by to mělo jít také.
abstract class Auto
{
}
class Mercedes extends Auto
{
}


myslel jsem že v PHP jde nějak jednoduše přetypovat
Neříkám, že ne. Sám jsem to nikdy nepotřeboval, takže jsem po tom ani nepátral.

WertriK:
To úplně tak nechápu, nemyslel jste spíš tohle?
 $obj = new Mercedes();
 $obj->otyp = "mercedes";


Každopádně tohle je obcházení problému, podstatou instanceof je, že vám PHP zaručí, že na nic nezapomenete. Pořád si myslím, že by to šlo pokládat nějak elegantně. Koneckonců Mercedes je logicky potomek Auta a v případě dědění musí instanceof Auto projít.
Koudis
Profil
Alphard:
ty jo, asi ano ...nemusíse rozhodovat v fciv AUTO ..rovnou vytvořím to co potřebuji a pak to kontroluji ...(sice budu muset předělat polovinu systému ..ale ten vysledek stojí za to)...
to je ono ...dělal jsem to zbytečně složitě, mo složitě a ono to jde tak jednoduše ...
WertriK
Profil
Alphard:
Pochopil jsem to tak, že uživatel odešle nějaký požadavek a třída Auto vytvoří podle požadavku určitý objekt např. třídy Mercedes. A Koudis chce potom dále zjistit co vlastně třída Auto vytvořila.

Koudis:
Ještě mě napadlo něco trošku jiného.

<?php

$obj;

class Auto {    

    public function __construct () {
        global $obj;
        $obj = new Mercedes();

    }

}

class Mercedes {

    public function Foo() {
        echo "Foo";
    }

}

$auto = new Auto();

if ($obj instanceof Mercedes) {

    echo "Mercedes";

} else {

    echo "Auto";

}

?>

Vyzkoušeno.
Kacko
Profil
Spravne reseni je od uzivatele Alphard. Jine navrhy zde jsou architektonicky spatne.
Koudis
Profil
Nakonec jsem to vyřešil tak že jsem do každé třídy dal předdefinovanou konstantu a porovnávám ty konstanty, je to nejjednodužší řešení, pokud bych to měl kontrolovat skzre instanceof AUTO (AUTO by byla třída ze které by dědil mercedes) musel bych překopat celou strukturu, a to je ne hodně dlouho ... díky za rady...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: