类设计继承/组合

时间:2012-04-11 06:23:32

标签: php oop design-patterns

我必须为条件生成类图,条件类似于:

  

水果有颜色,水果可以生长。苹果是水果。       他们有种子。种子可以制作新的苹果。

在实施任何设计之前,我想咨询一些专家。

我在考虑这样的事情,但我不是专家所以请在这里帮助我

abstract class Fruit
{
    protected $_color;

    abstract function grow();

    protected function seed(Fruit $fruit)
    {
        return $fruit;
    }
}

class Apple extends Fruit
{

}

如何使用合成或继承实现这一目标?

3 个答案:

答案 0 :(得分:1)

有果实有种子。苹果是其中之一。所以我会使用简单的普通继承设计:

abstract class Fruit
{
     private $color;

     public function getColor(){/* */};
     public function setColor($color){/* */}

     abstract public function grow();
}

abstract class SeedableFruit extends Fruit
{
    public function seed()
    {
        //Do something
    }
}

class Apple extends SeedableFruit
{
    public function grow()
    {
        //Do something
    }
}

通过这种方式,您无法在SeedableFruit种子中重复使用非Fruit的grow方法的实现,但如果您认为自然进化是如何工作的,那么它是有意义的...因为在这种情况下,两个水果有一个共同的祖先,以相同的方式增长,因此可以解决在类层次结构中插入该共同祖先的问题。

替代设计是使用DecoratorPattern来描述可以种子的果实,然后使用new SeedableFruitDecorator(new Apple());之类的调用创建带种子的Apple。但我认为这不是正确的方法,因为一个苹果总是种子

答案 1 :(得分:0)

如果我尝试为此创建一个对象,我会想出这个:

abstract class Fruit{
protected $color;
protected $age;
public $isSeedless;

public function getColor(){
return $this->color;
}

public function getAge(){
return $this->age;
}

public function setColor($color){\
$this->color = $color;
}

public function setAge($age){
$this->age = $age;
}

abstract function getFruit();
}

class Apple extends Fruit{
protected $appleCount;

public function __construct(){
$this->isSeedless = false;
}

public function getFruit(){
$fruit = new Apple();
return $fruit;
}
}

:)

答案 2 :(得分:0)

    // This is what i would do: 
    using System;
    using System.Collections.Generic;

    namespace ApplesAndFruitsDesign
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<string> colors = new List<string>() { "red" };

                Fruit apple = new Fruit(colors, true, true, 3, "Apple");
                Console.Write("MyFruit Details: Fruit.Name = {0}", apple.FruitName);
                Console.ReadKey();
            }
        }

        public class Fruit
        {
            public List<string> Colors { get; set; }
            public bool CanGrow { get; set; }
            public bool HasSeeds { get; set; }
            public int SeedsCount { get; set; }
            public string FruitName { get; set; }

            public Fruit(List<string> colors, bool canGrow, bool hasSeeds, int seedsCount, string name)
            {
                this.Colors = colors;
                this.CanGrow = canGrow;
                this.HasSeeds = hasSeeds;
                this.SeedsCount = seedsCount;
                this.FruitName = name;
            }

            public List<Fruit> MakeFruitFromSeeds()
            {
                List<Fruit> fruits = new List<Fruit>();
                for (int i = 0; i < this.SeedsCount; i++)
                {
                    Fruit fruit = new Fruit(this.Colors, this.CanGrow, this.HasSeeds, this.SeedsCount, this.FruitName);

                    fruits.Add(fruit);
                }

                return fruits;
            }
        }
    }