Если двойная отправка окажется слишком навязчивой, вы можете вызвать метод с помощью отражения и динамически разрешить соответствующую перегрузку.
protected bool ValidAdvert(Base item)
{
if (item.GetType() == typeof(Base))
throw new ThisIsAnAbstractClassException();
Type type = typeof(CurrentClass);
MethodInfo method = type.GetMethod("ValidAdvert",
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[] { item.GetType() },
null);
return (bool)method.Invoke(this, new object[] { item });
}
protected bool ValidAdvert(Derived1 item)
{
return ADerived1SpecificPredicate;
}
protected bool ValidAdvert(Derived2 item)
{
return ADerived2SpecificPredicate;
}
Этот шаблон называется MultipleDispatch , хотя вызов метода с помощью отражения медленнее, чем непосредственный вызов метода (если метод вызывается менее чем несколько сотен раз в секунду, это не потребует дополнительных затрат) у него есть то преимущество, что вам не нужно изменять иерархию классов, как в шаблоне Double Dispatch.
Это будет еще проще, когда c # 4.0 выйдет с ключевым словом dynamic:
protected bool ValidAdvert(Base item)
{
if (item.GetType() == typeof(Base))
throw new ThisIsAnAbstractClassException();
dynamic dynamicThis = this;
return (bool)dynamicThis.ValidAdvert(item as dynamic);
}