我有一个系统在大量的Things
上执行操作,这些可以被认为是通过通信通道访问的硬件设备。C#,抽象超类实现由子类定义的具体变量?
我使用一个管理器构造来接受单个Things
的任务。现在,至少有三种类型的Thing
,它们与它们具有稍微不同的属性。经理必须知道这些额外的属性,因为他们需要正确地执行任何操作(一些Things
必须有他们的X foo'd而不是他们的Y等)。
目前我有每种类型的东西单独的经理类。这导致大量的重复,因为Things
大部分是相似的。
如果我可以有一个抽象管理器来实现大量的功能,然后每个具体的实现可以提供少量的额外位,那就太好了。
这里是一个大大简化例如:
public abstract class ThingManager
{
private ConcurrentDictionary<Guid, ??ThingTask??> _ThingTaskQueue;
public virtual AddNewThingTask(<params>)
{
??ThingTask?? NewTask = new ??ThingTask??(<params>);
_ThingTaskQueue.Add(NewTask);
Monitor.Pulse(_NewDataToProcess);
}
/* Implemented by the concrete, will depend on the type of ??ThingTask?? */
public abstract GetSomeTaskParameterForAThing(Guid thingID)
}
public class ThingTask
{
public enum ThingOperation
{
Foo,
Bar
};
public String Name { get; set; };
public ThingType Type { get; set; };
public ThingOperation Operation { get; set; }
}
public class AdvancedThingTask
{
public enum ThingOperation
{
Foo,
Bar,
Baz
};
public String Name { get; set; };
public ThingType Type { get; set; };
public ThingOperation Operation { get; set; }
public Boolean EnableFrobber { get; set; }
}
正如你可以看到我需要一些方法,确定具体ThingManager
时有??ThingTask??
是A ThingTask
或AdvancedThingTask
。然后,在实现抽象方法时,要使用额外的属性。
使用接口??ThingTask??
将无法正常工作,因为必须在接口中声明属性,并且每个属性都有不同的可用属性。
我得到我想的东西就如何做到这一点干净很明显的感觉,希望有人能帮助:)
非常感谢您的评论。我只是谷歌泛型类,这看起来像强大的东西。我会立即阅读。 – Cursorkeys 2012-02-27 17:28:32
它们在C#中被称为泛型,并且与C++模板不同 – 2012-02-27 17:48:03
哦哇,泛型非常好。我已经实现了整个事情,并使用[link](http://stackoverflow.com/a/3054835/1228201)中显示的Reflection方法从我的泛型类型参数中提取合适的构造函数。这是一个耻辱它现在工作,这是非常有趣:) – Cursorkeys 2012-02-28 09:30:07