Здравствуйте, ksg71, Вы писали:
K>.....
Спасибо за действительно верное решение, но в моем случае оно не подходит.
Попробую объяснить чего я хочу по подробнее. Я делаю три базовых синглетона (обычный, уникальный в пределах сессии, уникальный в пределах HTTP-запроса): Singleton<T>, HttpSessionSingleton<T> и HttpRequestSingleton<T>. Они отличаются только способом выдачи Instance: для Singleton<T> выдается статичный экземпляр (исходник класса приведен выше); для HttpSessionSingleton<T> выдается экземпляр хранящийся в ASP.Net сессии и т.п.
Я хочу избавится от ".Instance." в коде "SingleUserDB.Instance.SomeMethod()", чтобы этот код превратился в "SingleUserDB.SomeMethod()".
Данная проблема стоит для меня скорее в чисто теоретических целях (просто я хочу, чтобы код выглядел красиво), на практике конечно можно пользоваться ".Instance.".
Основная идея моего проектирования данного куска — нужно чтобы код выглядел так:
public class CurrentUser:HttpSessionSingleton<CurrentUser>
{
private string _Name=null;
public CurrentUser()
{
_Name="имя";
}
public static string Name
{
return Instance._Name;
}
}
Теперь в любом месте программы (без всякого создания CurrentUser-а, операций с сессией и т.п.) мы можем написать:
string s=CurrentUser.Name;
При этом класс CurrentUser должен наследоваться как от синглетона (чтобы автоматом создаваться — Instance), так и содержать Instance, имеющего тип "самого себя" (чтобы взять базовую функциональность -Name).
Все отлично работает до тех пор, пока мы не наследуем CurrentUser:
public class VIPCurrentUser:CurrentUser
{
public VIPCurrentUser()
{
_Name="какое-то другое имя"; //этот кусок никогда не выполнится, вместо него будет неявно вызываться конструктор CurrentUser()
}
}