Обходной путь или альтернатива отсутствию статических методов в интерфейсе - PullRequest
3 голосов
/ 10 сентября 2010

Я реализую наивный поиск в моем приложении, и поиск будет осуществляться по паре различных типов объектов (Клиент, Назначение, Активность и т. Д.). Я пытаюсь создать интерфейс, который будет иметь типы для поиска. Я хотел бы сделать что-то вроде этого:

public interface ISearchable
{
    // Contains the 'at a glance' info from this object 
    // to show in the search results UI
    string SearchDisplay { get; }

    // Constructs the various ORM Criteria objects for searching the through 
    // the numerous fields on the object, excluding ones we don't want values 
    // from then calls that against the ORM and returns the results
    static IEnumerable<ISearchable> Search(string searchFor);
}

У меня уже есть конкретная реализация этого на одном из объектов моей доменной модели, но я бы хотел распространить его на другие.

Проблема очевидна: у вас не может быть статических методов в интерфейсе. Есть ли другой предписанный метод для достижения того, что я ищу, или есть обходной путь?

Ответы [ 3 ]

3 голосов
/ 10 сентября 2010

Интерфейсы действительно определяют поведение объекта, а не класса.В этом случае, я думаю, одно решение состоит в том, чтобы разделить это на два интерфейса:

public interface ISearchDisplayable
{
    // Contains the 'at a glance' info from this object 
    // to show in the search results UI
    string SearchDisplay { get; }
}

и

public interface ISearchProvider
{
    // Constructs the various ORM Criteria objects for searching the through 
    // the numerous fields on the object, excluding ones we don't want values 
    // from then calls that against the ORM and returns the results
    IEnumerable<ISearchDisplayable> Search(string searchFor);
}

Экземпляр ISearchProvider является объектом, который выполняет фактический поиск,в то время как объект ISearchDisplayable знает, как отобразить себя на экране результатов поиска.

0 голосов
/ 10 сентября 2010

Похоже, вам понадобится хотя бы один другой класс, но в идеале вам не нужен отдельный класс для каждого ISearchable. Это ограничивает вас одной реализацией Search (); ISearchable должен быть написан, чтобы учесть это.

public class Searcher<T> where T : ISearchable
{
    IEnumerable<T> Search(string searchFor);
}
0 голосов
/ 10 сентября 2010

Я действительно не знаю решения для C #, но согласно этому вопросу , Java, похоже, имеет ту же проблему, и решение состоит в том, чтобы просто использовать singleton объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...