OOP问题:品类、子品类和产品之间的关系

问题描述 投票:0回答:1

我现在正在使用PHP,尝试自己做一个练习来学习,但目前遇到了问题。

我的设计是这样的:1个类别将包含0到多个子类别,1个子类别将包含0到多个产品,在我的情况下,每个产品只属于1个子类别 。在我看来,它们是组合关系(如有错误,请指正),但之后我不知道如何编写这种关系的代码。在我看来,它应该是 3 个类(Category,SubCategory,Product),有自己的属性和方法。但可能是因为我的心思还停留在我的设计页面上。我将创建一个用于添加新类别及其子类别的页面(当然它还会有另一个用于编辑和更新的页面)。并创建一个用于添加新产品的页面。

如果我这样写CategorySubCatgory的代码,那么Product类呢?我所困扰的是,如果我像这样编写类Product,但我已经将属性[product]放在类SubCategory中,这不是一个错误的逻辑吗?谁能告诉我设计这种关系的正确逻辑?我知道对于很多前辈来说这可能是一个愚蠢的问题,但它确实困扰了我一个月而没有正确的解决方案。

此外,对于如何设计良好的班级结构和关系,有什么建议或材料吗?我觉得这对我来说真的很难。

感谢您查看我的问题。

Class Category{
private $subCat;

public function createNewSubCat(){
$this->subCat[]=new SubCategory();
}
}

Class SubCategory{
private $product;
public function createNewProduct(){
$this->product[]=new Product();
}
}

Class Product{
private $cat;
private $subCat;

public function setCategory(Category $c){
$this->cat=$c;
}

public function setSubCat(SubCategory $subC){
$this->subCat=$subC;
}
}
php class oop composition
1个回答
0
投票

您可以将 CategorySubCatgory 类合并为一个 Category 类。像这样:

class Category
{
    private $parentCategory = NULL;
    private $categoryLevel = 0;
    private $categories = [];
    private $products = [];

    public function __construct($parentCategory = NULL)
    {
        if ($parentCategory) {
            $this->parentCategory = $parentCategory;
            $this->categoryLevel = $parentCategory->getCategoryLevel() + 1;
        }
    }

    public function getCategoryLevel()
    {
        return $this->categoryLevel;
    }

    public function createNewCategory()
    {
        return $this->categories[] = new Category($this);
    }

    public function createNewProduct(){
        return $this->products[] = new Product($this);
    }
}

class Product
{
    private $parentCategory;

    public function __construct($parentCategory = NULL)
    {
        $this->parentCategory = $parentCategory;
    }
}

请注意,为了简单起见,我编写了这个松散类型的代码,但我向类别类添加了“level”属性,因此您可以检查特定类别在树中的深度。

如您所见,没有理由有“SubCategory”类。这简化了您的代码,尤其是当您想要呈现类别时。

注意我如何使用构造函数连接子类别和产品。

您可以添加限制:当类别类具有子类别时,您不能添加产品,并且当它具有产品时,它不能有子类别。或者,您也可以允许这样做。

© www.soinside.com 2019 - 2024. All rights reserved.