We have a base class: Filter. DistrFilter and ReportFilter inherit from Filter.
In another class, FilterService.cs, we have two functions that accept these three class types. FilterService operates on Filter objects but it does not inherit from anything.
public class FilterService
{
public string GetDesc(List<T> filters) where T : Filter
{
if(filters.Count == 0) return String.Empty;
StringBuilder s = new StringBuilder("<ul>");
foreach (T f in filters)
s.AppendFormat("<li>{1}</li>", GetFilterText(f));
s.Append("</ul>");
return s.ToString();
}
public string GetFilterText(Filter f)
{
return "filter";
}
public string GetFilterText(DistrFilter f)
{
return "distr filter";
}
public string GetFilterText(ReportFilter f)
{
return "report filter";
}
}
public static void main(string[] args)
{
List<DistrFilter> distrFilters = new List<DistrFilters>();
distrFilters.Add(new DistrFilter());
distrFilters.Add(new DistrFilter());
distrFilters.Add(new DistrFilter());
FilterService fs = new FilterService();
Console.WriteLine(fs.GetDescription(distrFilters));
}
Then it prints:
- filter
- filter
…
How do I get it to print this instead?
- distr filter
- distr filter
…
Either implement
GetFilterText()as a virtual method inFilter:Then do this:
Or if you want to separate the concern of specifying the filter text from the
Filterclasses, use double dispatch (visitor pattern). This is useful if you can have different types of filter services. This can be done this way:Then in your service:
Some references: Double dispatch, Visitor Pattern