我有一个系统可以对许多Things
执行操作,这些系统可以被视为通过通信渠道访问的硬件设备。
我使用一个接受单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??
成为ThingTask
或AdvancedThingTask
时。然后,在实现抽象方法时,可以使用额外的属性。
使用??ThingTask??
的接口不起作用,因为必须在接口中声明属性,并且每个属性都有不同的属性。
我感觉我错过了一些非常明显的关于如何干净利落的事情,希望有人可以提供帮助:)
答案 0 :(得分:3)
使用泛型而不是纯粹的抽象类,有些类似于:
public abstract class ThingManager<T> where T : ThingTask
取决于你的完整实现我怀疑这是否需要保持抽象
答案 1 :(得分:0)
你是否有任何理由不将AdvancedThingTask作为ThingTask的子类?
public class ThingTask
{
public virtual string Name { get; set; }
public virtual ThingType Type { get; set; }
public virtual ThingOperation Operation { get; set; }
public virtual void DoThing() { /*Do something associated with ThingTask*/ }
}
public class AdvancedThingTask : ThingTask
{
public bool EnableFrobber { get; set; }
public override void DoThing() { /*Do something associated with AdvancedThingTask*/ }
}
我看到的唯一问题是ThingOperation需要在类之外声明,以便它可以包含所有值,或者其他一些解决方案,使类具有不在基本声明中的值。这个问题可以通过将你想要做的事情作为虚拟方法放在类中来解决。
P.S。为什么您的属性以下划线开头?通常是为私有变量保留的。