0

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

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

在我实施任何设计之前,我想听听一些专家的建议。

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

abstract class Fruit
{
    protected $_color;

    abstract function grow();

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

class Apple extends Fruit
{

}

如何使用组合或继承来实现这一点?

4

3 回答 3

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
    }
}

通过这种方式,您无法重用非SeedableFruitin aFruit与种子的增长方法的实现,但如果您认为自然进化是如何工作的,那是有道理的......因为在这种情况下,这两种水果有一个共同的祖先,它生长在以同样的方式,因此可以在类层次结构中插入该共同祖先来解决问题。

另一种设计是使用DecoratorPattern来描述可以有种子的水果,然后创建一个带有种子的 Apple,调用类似new SeedableFruitDecorator(new Apple());. 但我认为这不是正确的方法,因为Apple 总是有种子

于 2012-04-11T08:28:09.803 回答
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;
}
}

:)

于 2012-04-11T06:53:29.870 回答
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;
            }
        }
    }
于 2012-04-11T13:20:29.137 回答