【发布时间】:2015-01-29 04:39:55
【问题描述】:
我有来自多个组织(警察、消防、办公室)的数据,需要以不同格式输出。
为了实现这一点,我定义了以下内容(这有点简化):
事务类 -
- “成功”指示符 - 布尔值。
- “部门类型”- 字符串或枚举。
- 可以是任何类型的类 - 警察、消防或办公室(您将看到我的问题是关于此的)。
- GenerateOutput() 方法 - 处理文件格式的生成。
警察课
- 年龄 - 字符串
- VehicleNumber - 整数
- 主管 - 字符串
消防类
- 名称 - 字符串
- FireEngineNumber - 整数
- 县 - 枚举
- WorkTimings - 枚举
办公类
- 年龄 - 字符串
- DeskNumber - 整数
- 部门 - 字符串
- PayScale - 枚举
- IsManagement - 布尔
如您所见,Police、Fire 和 Office 类没有任何共同点,主要用作数据承载实体。我打算使用工厂返回带有数据的适当通用(不是 C# 通用)事务对象(其中包含 Police、Fire 或 Office 数据的事务对象),然后将返回的对象传递给确定每个人需要的文件格式(CSV、Excel 或 XML;在配置文件中指定)的策略模式。
我的问题在于 Transaction 对象的定义。
“3”中的类是什么类型。 Transaction类的需要是什么?每个组织的数据不同,没有共同的成员,我无法为所有人定义一个共同的类。
整体设计是否合适?我还应该考虑哪些其他设计?
基于以下 Peter 的 cmets: 我认为使用泛型可能会起作用,但我遇到了一个问题。我想使用工厂返回请求的对象,使用 GetTransactionObject,如下所示。 GetTransactionObject 的返回类型应该是什么来适应这个。
类事务工厂 {
Dictionary<string, Type> typeClassLookup;
public TransactionFactory()
{
typeClassLookup = new Dictionary<string, Type>();
typeClassLookup.Add("Police", typeof(PoliceData));
typeClassLookup.Add("Fire", typeof(FireData));
}
Transaction<????> GetTransactionObject(string org)
{
if( typeClassLookup.TryGetValue(org, out typeValue))
{
switch (typeValue.ToString())
{
case "policeData":
transactionObject = new Transaction<PoliceData>() { Data = new PoliceData(), params = null};
case "FireData":
transactionObject = new Transaction<FireData>() {Data = new FireData(), params = null};
}
}
return transactionObject;
【问题讨论】:
-
#2 当然是基于意见的。对于#1,即使它们没有共同的字段,您仍然可以拥有一个共同的基类。它只是一个没有成员的空(可能是抽象的)基类(或者它可能包含派生类必须实现的一些通用抽象函数)。或者您可以使用界面作为标记。没有更多信息,实在是太宽泛了。
-
我相信你可以有一个通用的接口,可以称为
IWorkPlace,可以是办公室或警察局,也可以是定义一些常见行为的消防部门。缺陷在于,如果类型定义了其他不常见的行为,那么您可能不得不不时地强制转换该对象以使用特定行为,但它仍然可能解决目的。 -
谢谢马特,如果你现在看一下这个问题,将不胜感激,已经添加了更多细节。
-
没错,Nikhil,作为最后的手段,我想继续将这些对象转换为适当的类型。您是否会考虑其他设计以及附加信息?
-
您应该发布实际代码。
标签: c# design-patterns