Ваш вопрос, в частности, касается возможности реализации шаблона синглтона исключительно с использованием базового класса, без внесения каких-либо изменений кода в производные классы.
Можно сделать что-то вроде этого:
public abstract class Page
{
// Your normal Page base class things
}
public abstract class Page<T> : Page where T : Page<T>, new()
{
// Or whatever singleton pattern you want to implement
public static readonly T Instance = new T();
}
public class HomePage : Page<HomePage>
{
}
Это позволяет вам написать:
var homePage = HomePage.Instance;
Это работает, потому что Page<T>
имеет свой собственный набор статических данных, который является отдельным для каждого T
- поэтому Page<HomePage>
имеет отдельные статические данные для Page<LogInPage>
.
Однако вам нужно будет изменить каждую из ваших страниц, чтобы она производилась от Page<PageSubclass>
, а не от Page
.
Тем не менее, я бы взял более простоймаршрут добавления кода, например:
public static readonly HomePage Instance = new HomePage();
к каждому из ваших Page
подклассов. Это значительно меньше "волшебства", не требует отражения для создания экземпляров страниц и займет всего несколько минут, чтобы добавить к 70 объектам страницы. В конце концов, вам придется изменить их все, чтобы они были производными от Page<T>
, чтобы в любом случае использовать этот шаблон.