Есть один очень странный способ сделать это:
class Base
{
// Put common stuff in here...
}
class Base<T> : Base where T : Base<T>, new()
{
private static T m_instance = new T();
public static T Instance { get { return m_instance; } }
}
class DerivedA : Base<DerivedA> {}
class DerivedB : Base<DerivedB> {}
class DerivedC : Base<DerivedC> {}
Это работает, потому что есть одна статическая переменная на составной тип - например, List<string>
отличается от List<int>
и поэтому имеет отдельные статические переменные.
Я также воспользовался возможностью сделать его экземпляром производного класса - я не знаю, хотите ли вы этого или нет, но я думал, что по крайней мере сделаю его доступным для вас 1010 *
В общем, это неприятная вещь. Статические переменные на самом деле не предназначены для такого использования - я только что использовал функцию обобщений, чтобы получить «своего рода» поведение, о котором вы просили.
Также обратите внимание, что Base<DerivedA>.Instance
вернет тот же результат, что и DerivedA.Instance
- свойство / переменная не "знает", что вы используете DerivedA.Instance
. Я не знаю, важно ли это для тебя.
С помощью дополнительного неуниверсального класса вы можете написать:
Base t = DerivedA.Instance;
t = DerivedB.Instance;
Если вам это не нужно, выньте его:)