C#,抽象超类实现子类定义的具体变量?

时间:2012-02-27 17:18:14

标签: c# inheritance abstract-class

我有一个系统可以对许多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??成为ThingTaskAdvancedThingTask时。然后,在实现抽象方法时,可以使用额外的属性。

使用??ThingTask??的接口不起作用,因为必须在接口中声明属性,并且每个属性都有不同的属性。

我感觉我错过了一些非常明显的关于如何干净利落的事情,希望有人可以提供帮助:)

2 个答案:

答案 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。为什么您的属性以下划线开头?通常是为私有变量保留的。

相关问题