我有一個系統在大量的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