Ho una classe chiamata Assembly
che nasconde l'implementazione dei prodotti sottostanti. ProductA
può avere un set di getter, ProductB
può avere un altro.Come si può far conoscere il codice PHP di sottotipi di classe specifici passati ad esso, quando si utilizza il polimorfismo?
Mentre PHP è abbastanza tollerante e se non si mescolano prodotti e getter, il mio codice funziona, ma non v'è alcuna protezione offerta per quando faccio rovinare e popolare Assembly
con ProductA
, ma poi utilizzare un getter da ProductB
.
Inoltre, il mio IDE conosce i metodi di entrambe le classi, quindi non è disponibile il completamento automatico quando lavoro all'interno di Assembly
con getter da Product
.
voglio di più il codice a prova di proiettile, quello in cui Assembly
sa o è a conoscenza di che Product
sottotipo attualmente ospita. c'è un modo per farlo?
esempio riportato di seguito
class Assembly
{
private $product;
public function setProduct(Product $product) {
$this->product = $product;
}
public function getA() {
return $this->product->getA();
}
public function getB() {
return $this->product->getB();
}
}
class Product { }
class ProductA extends Product
{
public function getA() {
return "A";
}
}
class ProductB extends Product
{
public function getB() {
return "B";
}
}
//set assembly
$assembly = new Assembly();
//define product sub-type
$product = new ProductB();
//place product into assembly
$assembly->setProduct($product);
//assembly has no clue which subtype it has
print $assembly->getB(); // "B"
print $assembly->getA(); // prints nothing
Interface Suggerimento
interface CompositeProductInterface
{
public function getA();
public function getB();
}
//update code in Assembly to:
public function setProduct(CompositeProductInterface $product)
{
$this->product = $product;
}
Questo mi dà completamento automatico nella mia IDE, che è bello, ma non risolve le altre questioni. Inoltre sono un po 'inquieto nel mettere insieme le cose in un unico prodotto "composito" .... Sembra più un work-around. Nel mio caso specifico, ho due prodotti molto simili che differiscono su alcune cose minute come alcune proprietà.
Real World Esempio
Entrambi i modelli del prodotto A e B hanno un disegno tecnico in cui sono elencate le variabili per identificare diverse dimensioni del prodotto. Le dimensioni nominate sono simili su entrambi i prodotti. Ad esempio, M1 sul prodotto A indica la stessa dimensione fisica sul prodotto B. Tuttavia, il prodotto A presenta caratteristiche non presenti sul prodotto B e viceversa.
Se si prova ancora troppo ipotetica, le dimensioni reali sul disegno effettivo sono elencati come B2 e B3. Queste dimensioni (B2, B3) non sono presenti sull'altro modello di prodotto. Voglio poter usare un costrutto assembly per elencare le variabili sul disegno, tra cui M1, B2, B3 e così via. Potrei faccio con
print $assembly->getM1(); //works for both products
print $assembly->getB2(); //works for one product only
print $assembly->getB3(); //same as above
Goal
obiettivo è di avere una sola classe (montaggio), responsabile della messa in vendita variabili di quota con nome, e ogni prodotto conosco solo per sé. Così
- Assemblea dice: "So tutto sulle variabili denominate voglio elencare (M1, B2, B3), a prescindere dal modello di prodotto"
- prodotto A dice: "Io so solo quello che contengono. Contengo denominata dimensione A. Non so cosa sia B né mi interessa
- Il prodotto B dice "Conosco solo B" ...
cool. puoi anche usare il costrutto 'ProductA :: class' invece di' "ProductA" 'con il vantaggio del tipo hinting dall'interprete IDE/PHP – Dennis
È una soluzione migliore per la comparazione. –