Я пытался найти название шаблона использования обобщений в C #, и я не знаю лучшего ресурса, чем переполнение стека!
Что я делаю, так это создание универсальной базыклассы, в которые непосредственно передается производный класс - я искал примеры этого или название шаблона, и я надеялся, что один из великих членов этого сообщества сможет мне помочь.
Я сделалописание того, как это работает на http://www.mobiusbay.com/home/alittlesomethingimcallingcascadinggenerics, но если вы не хотите читать его там, приведем пример:
public abstract class IndexedMemberBase<TDerivedClass> : IDisposable where
TDerivedClass : IndexedMemberBase<TDerivedClass>
{
#region Declarations & Properties
private static List<TDerivedClass> derivedInstances = new List<TDerivedClass>();
public static List<TDerivedClass> DerivedInstances
{
get { return derivedInstances; }
}
#endregion
#region Constructor(s)
public IndexedMemberBase()
{
if (derivedInstances == null) derivedInstances = new List<TDerivedClass>();
derivedInstances.Add((TDerivedClass)this);
}
#endregion
#region Methods
public void Dispose()
{
if (derivedInstances.Contains(this) == true)
{
derivedInstances.Remove((TDerivedClass)this);
}
}
#endregion
}
Это базовый класс, и производный класс может бытьневероятно просто - например:
public class IndexMember : IndexedMemberBase<IndexMember>
{
//Add all the crazy business you could ever want!
}
Этот фрагмент кода выбрасывает указатель на каждый экземпляр класса dervied в статическую коллекцию для общего использования - коллекция отличается для каждого производного класса, поэтому вы не будетеесть конфликты от него, существующие статически в базе.Я считаю, что это весьма полезно в моих проектах, и я надеюсь, что кто-то еще сможет найти его применение.
Важно отметить, что производный класс передает себя в общей сигнатуре базовому классу.
Если кто-то видел этот шаблон в использовании или знает имя для него - мне бы очень хотелось увидеть некоторые примеры или хотя бы назвать его по правильному имени!Сейчас я называю это рекурсивными дженериками, поскольку они, кажется, подходят, но я уверен, что есть более подходящее имя!
Большое спасибо за вашу помощь!
Адам