我有一个概念性的问题。我想使用设计模式工厂,使用枚举来了解要创建的对象类型。但是当谈到继承另一个集会时,我会坚持我的枚举...
让我解释一下案例:
我正在为管理水果的多个项目创建一个框架。
我创建了一个由抽象类IFruit
实现的接口Fruit
,从中继承Strawberry
,Apple
和Pear
。
我创建了一个包含FruitTypes
,Strawberry
和Apple
的枚举Pear
。
我使用虚拟方法创建FruitFactory
:
GiveMeANewFruit(FruitTypes newFruit)
,返回IFruit
。
一切都好。
我将我的框架发送到世界各地,我们西班牙工厂的某个人也需要管理香蕉。
他将创建继承Banana
的{{1}}类。
他将创建一个Fruit
,它将继承SpanishFruitFactory
并重新定义虚拟方法FruitFactory
,以下是该方法中的代码:
GiveMeANewFruit
但是,嘿,这就是问题所在。我知道像C#这样的语言不允许继承枚举。所以,我的家伙无法将Public Override IFruit GiveMeANewFruit(FruitTypes newFruit)
{
if (newFruit == FruitTypes.Banana)
return new Banana();
else
return base.GiveMeANewFruit(newFruit);
}
值添加到Banana
枚举。
那么,取代枚举的最佳模式是什么,这样我就可以为外界提供在我的概念中添加新对象类型的能力?
知道我不想在源代码之外有任何东西(没有XML文件,也没有数据库,也没有其他任何提供类型列表的东西)。
你有什么建议吗?
答案 0 :(得分:0)
我认为最好的替代是static class
。这就是我在php
中这样做的方式。
使用字段而不是static class
定义enum
,如果愿意,您甚至可以将字段定义为string
。
答案 1 :(得分:0)
将工厂方法更改为接受int
,并使用以下类实现枚举: -
public class FruitTypes
{
public const int Strawberry = 1;
public const int Apple = 2;
public const int Pear = 3;
}
public class SpanishFruitTypes : FruitTypes
{
public const int Banana = 4;
}
用法示例: -
factory.GiveMeANewFruit(FruitTypes.Pear)
factory.GiveMeANewFruit(SpanishFruitTypes.Banana)