Я могу вынудить класс с реализацией возвратить объект своего собственного типа?

Я выполняю веб-сайт с 7-8 миллионами просмотров страницы в месяц. Не ужасно очень, но достаточно, что наш сервер чувствовал загрузку. Решение, которое мы выбрали, было просто: Кэш-память на уровне базы данных. Это решение работает хорошо, если загрузка базы данных является Вашей основной проблемой.

Мы начали использовать Кэш-память для кэширования всех объектов и результатов базы данных, которые наиболее часто использовались. Это действительно работало, но это также представило ошибки (мы, возможно, избежали некоторых из тех, если бы мы были более осторожными).

, Таким образом, мы изменили наш подход. Мы создали обертку базы данных (с теми же самыми методами как наша старая база данных, таким образом, было легко переключиться), и затем мы разделили его на подклассы для обеспечения memcached методов доступа к базе данных.

Теперь все, что необходимо сделать, решают, может ли запрос использовать кэшируемый (и возможно устаревший) результаты или нет. Большинство запросов, выполненных пользователями, теперь выбирается непосредственно от Кэш-памяти. Исключениями являются обновления, и вставляет, который для основного веб-сайта только происходит из-за входа. Эта довольно простая мера уменьшила нашу загрузку сервера приблизительно на 80%.

5
задан Cros 6 November 2009 в 15:29
поделиться

4 ответа

Здесь ответ - Generics.

public interface IParser<T> where T:IParser<T> {
    T Parse(string s);
}

public class Parser : IParser<Parser> {
    public Parser Parse(string s) {
        return new Parser(s);
    }
}
8
ответ дан 18 December 2019 в 13:15
поделиться

Нет в интерфейсе декларация, нет. Лучшее, что вы можете сделать - это использовать обобщенные типы:

public interface IParser<T>
    where T: IParser<T>
{
    T Parse(string s);
}

public class Parser
 : IParser<Parser>
{
    public Parser Parse(string s)
    {
       return new Parser(s);
    }
}

Это не заставляет реализацию возвращать собственный тип, но, по крайней мере, позволяет ей это делать. Вот почему интерфейс IClonable возвращает объект из своего метода Clone , а не определенного типа.

---- Edit ----

Что нужно запомнить по этому вопросу: допустим, что мой код, для которого вы не t имеет какие-либо сведения о реализации, возвращает IParser , а ваш код вызывает метод Parse . Какой объект вы ожидаете вернуть, не зная конкретного типа возвращаемой ссылки IParser ? Я думаю, вы пытаетесь использовать интерфейсы для чего-то, для чего они не предназначены ...

5
ответ дан 18 December 2019 в 13:15
поделиться

Вы можете сделать это с Generics, но я бы, вероятно, придерживался возврата экземпляра интерфейса. Обратите внимание: поскольку класс реализует интерфейс, возврат его экземпляра - это нормально - он будет экземпляром того же типа и интерфейса.

public class Parser : I Parser
{
   public IParser Parser( string s )
   {
       return Parser(s);
   }
}
0
ответ дан 18 December 2019 в 13:15
поделиться

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

public class Parser : IParser {

    private Parser(string s) {
        //Do something with s, probably store it in a field
    }

    public static IParser GetNewParser(string s) {
        return new Parser(s);
    }
}
1
ответ дан 18 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: