我对使用OOP管理商店物品的系统的设计有疑问。我创建了具有属性$name和$price的抽象类Product。后来,我创建了扩展产品的Smartphone类。Smartphone具有$brand和$os属性。后来,我创建了扩展Product $cpuFrequency和$ram属性的类计算机。现在,如果我想创建一个对应于Nexus 5的对象,那么我必须做什么呢?例如,考虑到这个对象将具有
$name = "Nexus 5"
$price = "250"
$brand = "LG"
$os="Android"
$cpuFrequency "2.0"
$ram = "2".这里是一个类的例子。
abstract class Product {
private $name;
private $price;
//more methods
}
class Smartphone extends Product{
private $brand;
private $os;
}
class Computer extends Product {
private $cpuFrequency;
private $ram;
}还有可能是没有$os的电脑和没有$ram的智能手机。仅举一个例子:d
我知道智能手机是一台电脑。我做了个坏例子。请在电话和电脑上思考。电话有$number和$operator。现在,我想创造一个智能手机,是同时电话和电脑。
谢谢大家,再次为我的英语感到抱歉
发布于 2014-12-09 19:59:38
您可以尝试使用如下所示的ProductProperties类:
class ProductProperties
{
private properties = array();
public function getProperties()
{
return this->properties;
}
public function addProperty($id, $value)
{
this->properties[$id] = $value;
}
public function getProperty($id)
{
return this->properties[$id];
}
}
abstract class Product
{
private $properties;
//more methods
public function __construct(ProductProperties $properties)
{
$this->properties = $properties;
}
}您可以将类ProductProperties的对象传递给任何产品,并让它处理所有与属性相关的问题。这将使设计更加灵活,这样您就不需要仅仅因为产品有一组不同的属性就将其子类化。记住,子类是关于改变或添加行为的。
发布于 2014-12-09 19:55:52
通常,您应该以“子”类初始化超类的某种方式为类编写构造函数,以保持所有内容的一致性。
abstract class Product {
private $name;
private $price;
//more methods
public __construct($name, $price){
$this->name = $name;
$this->price =$price;
}
}
class Smartphone extends Product{
private $brand;
private $os;
// default value to $os: like that, we can create a Smartphone whitout an os
public __construct($name, $price, $brand, $os = null){
parent::__construct($name, $price);
$this->brand = $brand;
$this->os =$os;
}
}
class Computer extends Product {
private $cpuFrequency;
private $ram;
// default value to $ram: with this, we can create a Computer whiout ram
public __construct($name, $price, $frequency, $ram = null){
parent::__construct($name, $price);
$this->frequency = $frequency;
$this->ram =$ram;
}
}然后,要创建一台计算机,您可以为
$computer = new Computer('notBuiltToWindows', 560 , 2.0, 4);或者,在您的示例中创建Nexus:
$nexus = new Smartphone($name, $price, $frequency, $ram);并且,要创建一个智能手机,就可以将一个ram白化
$nexus = new Smartphone($name, $price, $frequency);发布于 2014-12-09 19:48:34
就像其他人说的那样,让太多的课程变得混乱。
这样做的目的是创建一个可以涵盖许多不同场景的类,而不需要做太多的工作。
例如,您可以有一个类Pet。狗是宠物,蛇也是.这并不意味着您应该创建一个FourLegged或Nolegs类。
就像您的产品一样,您可能有一个product类,它保存所有产品所共有的东西。您甚至可能希望有一个名为electronics的子类,它可以涵盖从电话到计算机的所有内容。
您可能有一个productType属性来说明它是什么样的电子产品(例如电话),但最终,不同的电子产品之间不会有太大的差异:电视、智能手机和计算机都有屏幕规格,智能手机和计算机都有内存、cpu等。
https://stackoverflow.com/questions/27387421
复制相似问题