我必须为条件生成类图,条件类似于:
水果有颜色,水果可以生长。苹果是水果。 他们有种子。种子可以制作新的苹果。
在实施任何设计之前,我想咨询一些专家。
我在考虑这样的事情,但我不是专家所以请在这里帮助我
abstract class Fruit
{
protected $_color;
abstract function grow();
protected function seed(Fruit $fruit)
{
return $fruit;
}
}
class Apple extends Fruit
{
}
如何使用合成或继承实现这一目标?
答案 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;
}
}
}