#c# #.net #generics #abstraction
#c# #.net #generics #абстракция
Вопрос:
Я пытался найти название шаблона использования generics в C #, и я не знаю лучшего ресурса, чем stack overflow!
Что я делаю, так это создаю универсальные базовые классы, в которые напрямую передается производный класс — я искал примеры этого или название шаблона, и я надеялся, что один из замечательных членов этого сообщества сможет мне помочь.
Я написал о том, как это работает на http://www.mobiusbay.com/home/alittlesomethingimcallingcascadinggenerics но если вы предпочитаете не читать это там, ниже приведен его пример:
public abstract class IndexedMemberBase<TDerivedClass> : IDisposable where
TDerivedClass : IndexedMemberBase<TDerivedClass>
{
#region Declarations amp; 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!
}
Этот фрагмент кода передает указатель на каждый экземпляр выделяемого класса в статическую коллекцию для общего использования — коллекция различна для каждого производного класса, поэтому у вас не будет конфликтов из-за того, что она статически существует в базе. Я нахожу это весьма полезным в своих проектах, и я надеюсь, что кто-то другой сможет найти ему применение.
Важно отметить, что производный класс передает себя в универсальной подписи базовому классу.
Если кто-нибудь видел этот шаблон в использовании или знает его название — мне бы очень хотелось увидеть несколько примеров или, по крайней мере, назвать его правильным именем! На данный момент я называю это рекурсивными дженериками, поскольку это кажется подходящим, но я уверен, что есть название получше!
Большое вам спасибо за вашу помощь!
Адам
Комментарии:
1. Привет, Адам, я использую тот же подход, но немного другой, мой базовый класс предназначен для генерации SQL на основе атрибутов, размещенных в свойствах производного класса!!! Мне тоже интересно узнать, что это шаблон …!
2. Кстати, почему приведенный выше код полезен для вас? Что вы делаете, имея возможность узнать из производного класса, каковы другие???
3. здесь для вас есть отличная ссылка: blogs.msdn.com/b/ericlippert/archive/2011/02/03 /…
4. Вау, я не могу поверить, как быстро я получил массу комментариев по моему вопросу! Спасибо всем!
5. Ренато, одна из вещей, для которых я использую это, — это легко перебирать каждый элемент коллекции в целях обработки — например, если на веб-странице я хотел создать пользовательский интерфейс для каждого экземпляра класса, я могу просто использовать приведенный выше шаблон для перебора их всех, и поскольку он строго типизирован, я могу ссылаться на его элементы напрямую для заполнения любого интерфейса, который я хочу.
Ответ №1:
Это называется странно повторяющимся шаблоном шаблона
(и по какой-то причине это очень, очень известно только на SO?)
Комментарии:
1. Большое вам спасибо, сехе — я поставил вам галочку в этом ответе. Я должен признать — мне НРАВИТСЯ название этого шаблона 🙂 Это просто слишком весело.
Ответ №2:
Эрик Липперт написал об этом в своем блоге.
Это называется странно повторяющимся шаблоном шаблона, хотя это относится к C , где они являются шаблонами, а не дженериками.
Комментарии:
1. BrokenGlass сказал это всего 20 минут назад 🙂 Тем не менее, это было отличное чтение, и я не возражаю, чтобы оно получило дополнительную информацию
2. У меня уже был загружен вопрос, и я потратил намного больше 20 минут на поиск этого сообщения…