Ok вопрос название далеко не о себе. Я вижу себя это часто делают:Общий базовый класс обертывает вложенный общий класс, чтобы уменьшить спецификацию аргумента типа: есть ли имя для этого шаблона?
От this answer:
public static class Equality<T>
{
public static IEqualityComparer<T> CreateComparer<K>(Func<T, K> keySelector)
{
return new KeyEqualityComparer<K>(keySelector);
}
class KeyEqualityComparer<K> : IEqualityComparer<T>
{
readonly Func<T, K> keySelector;
public KeyEqualityComparer(Func<T, K> keySelector)
{
this.keySelector = keySelector;
}
public bool Equals(T x, T y)
{
----
}
public int GetHashCode(T obj)
{
....
}
}
}
Что я сделал: Существует деталь реализации KeyEqualityComparer<T, K>
, которую я должен был назвать:
new KeyEqualityComparer<Person, int>(p => p.ID);
К гнездованию это как частный класс, я не только скрыл реализацию (публичный конструктор внутреннего класса сейчас неясен), но получил более сильный синтаксис:
Equality<Person>.CreateComparer(p => p.ID);
Обратите внимание, что я не унаследовал вложенный класс из родительского класса (который является статическим).
Или иногда я вижу себя doing this:
public abstract class Equater<T> : IEqualityComparer<T>
{
public static Equater<T> Create<TKey>(Func<T, TKey> keySelector)
{
return new Impl<TKey>(keySelector);
}
public abstract bool Equals(T x, T y);
public abstract int GetHashCode(T obj);
class Impl<TKey> : Equater<T>
{
readonly Func<T, TKey> keySelector;
public Impl(Func<T, TKey> keySelector)
{
this.keySelector = keySelector;
}
public override bool Equals(T x, T y)
{
----
}
public override int GetHashCode(T obj)
{
....
}
}
}
Другой подобный один here
public class Accessor<S>
{
public static Accessor<S, T> Create<T>(Expression<Func<S, T>> memberSelector)
{
return new GetterSetter<T>(memberSelector);
}
class GetterSetter<T> : Accessor<S, T>
{
public GetterSetter(Expression<Func<S, T>> memberSelector) : base(memberSelector)
{
}
}
}
public class Accessor<S, T> : Accessor<S>
{
Func<S, T> Getter;
Action<S, T> Setter;
public bool IsReadable { get; private set; }
public bool IsWritable { get; private set; }
public T this[S instance]
{
get
{
if (!IsReadable)
throw new ArgumentException("Property get method not found.");
return Getter(instance);
}
set
{
if (!IsWritable)
throw new ArgumentException("Property set method not found.");
Setter(instance, value);
}
}
protected Accessor(Expression<Func<S, T>> memberSelector) //access not given to outside world
{
----
}
}
Обратите внимание, что в этих двух случаях я унаследованный от упаковки класса. Так что теперь я не только получить выгоды от первого, но я также могу поддерживать список, как это:
List<Equater<Person>> { persons with different implementations };
Его помогает мне время от времени. Итак, мне любопытно узнать, есть ли название для этого шаблона?
Извините, я отредактировал ответ, так как я думаю, что я вообще не использовал шаблон команды или строителя. Не стесняйтесь редактировать, если есть расхождения в моем ответе – nawfal
@nawfal: Хотя мы рекомендуем редактировать ответы, чтобы улучшить их, помните, что при этом вы должны уважать авторское авторское письмо. Ваше редактирование, по-видимому, слишком сильно изменилось в оригинальном ответе Берти - в частности, ваше редактирование в последнем абзаце потенциально может возникнуть, если положить слова в чужой рот. Тем не менее, я оставлю его Берти, чтобы решить, хочет ли он сохранить изменения или отбросить их обратно, поскольку ответ принадлежит ему. Если он отбросит их назад, вы можете опубликовать свое исследование в качестве своего собственного ответа. – BoltClock
Спасибо BoltClock - я отбросил изменения, так как считаю, что слишком сильно изменил мой оригинальный ответ. Однако, если @nawfal предложит добавить свои комментарии в качестве нового ответа, то, очевидно, у меня нет проблем с этим. – Bertie