c#: Абстрактный класс с реализациями в виде синглтона. Как запретить иметь публичный конструктор?
Пишу скрипт для компьютерной игры, поэтому не кидайтесь камнями за возможную некоторую нелепость. Никак не могу справиться с задачей. Необходимо реализовать систему прослушки каналов. Каждому каналу соответствует частота вещания в формате string. Каналы необходимо стакать в List. Прослушка осуществляется путем пребора листа и проверки висит ли на канале сообщение. То есть выглядеть это должно примерно так:
// global
public static List<Channel> MyChannels = new List<Channel>();
// Где то в конструкторе скрипта
FirstChannel.GetInstance(); // При вызове метода GetInstance() при отсутствии экземпляра класса
SecondChannel.GetInstance(); // созданный объект автоматически записывается в лист MyChannels.
...
// В методе Main()
foreach (Channel channel in MyChannels)
{
if (channel is FirstChannel)
{
// todo
continue;
}
}
Класс Channel должен быть абстрактным и определять наследников, которые обязательно должны быть реализованы синглтоном. Нужно это для того, чтоб не существовало двух экземпляров одного класса канала, ибо добавляться в лист они будут при создании внутри класса. И если экземпляра будет два, то одно и то же сообщение обработается дважды. Проблема в синтаксисе языка. Моего знания C# хватило только на это:
public abstract class Channel
{
protected Channel instance = null;
protected abstract string GetWave();
public abstract Channel GetInstance();
}
public class FirstChannel : Channel
{
// Родитель не запрещает публичный иметь конструктор, а нужно
protected override string GetWave()
{
return MyConfig.FirstChannelWave;
}
public override Channel GetInstance()
{
if (instance == null)
{
instance = new FirstChannel();
MyChannels.Add(instance);
}
return instance;
}
}
Проблема в том, что при такой реализации дочернему элементу класса Channel никак не запрещено иметь свой конструктор, а значит идея не реализована. Всё упирается в то, что как-то необходимо запретить дочернему классу иметь конструктор. Я не нашел адекватных способов как это сделать, однако я далеко не спец в С#, поэтому подозреваю, что это возможно. Надеюсь, здесь есть знатоки, которые помогут мне с решением))