Краткая версия:
У меня есть абстрактный класс A. У него есть метод, которому необходимо знать значение свойства статического класса, специфичного для каждого подкласса. Имя и тип одинаковы, только значение может быть уникальным для каждого подкласса.
Могу ли я определить это статическое свойство в базовом классе A, чтобы иметь к нему доступ с помощью методов, определенных в A, но сохраняя при этом значения свойств разных подклассов несвязанными?
Или как мне реализовать что-то подобное?
Полная версия:
Скажем, у меня есть абстрактный базовый класс для моделей данных. У него есть общедоступное свойство Id
(Int32).
Я хотел бы реализовать конструктор в базовом классе, который генерирует новый идентификатор на основе последнего назначенного идентификатора для объектов подкласса.
Причина в том, что реальные идентификаторы назначаются автоматически базой данных, но каждый объект модели данных уже должен иметь уникальный идентификатор, когда он создается, но еще не записан в базу данных. Поскольку база данных назначает в качестве идентификатора только положительные целые числа, я планирую присвоить вновь созданным объектам модели данных временный уникальный отрицательный идентификатор. Как только объект будет записан, идентификатор изменится на настоящий.
Поскольку у меня довольно много разных классов модели данных, все они происходят от моего абстрактного базового класса, я подумал, что было бы хорошо включить туда эту функциональность, чтобы не дублировать ее. Но у каждого подкласса должен быть свой собственный счетчик, указывающий на следующий свободный отрицательный идентификатор, поскольку идентификаторы разных классов не связаны.
Поэтому мне нужно статическое свойство в каждом подклассе, хранящем последний назначенный временный идентификатор этого класса, но механизм его назначения всегда один и тот же и может быть реализован в конструкторе абстрактного базового класса. Однако я не могу получить доступ к свойству из базового класса, которое должно быть реализовано подклассами, что означает, что я должен определить его в базовом классе. Но будет ли это статическое свойство глобальным для всех подклассов, чего я не хочу?
Как я могу реализовать этот временный счетчик идентификаторов наиболее элегантным способом?
Пример упрощенного кода:
public abstract class ModelBase
{
public Int32 Id { get; set; }
protected static Int32 LastTempId { get; set; } = 0;
public ModelBase()
{
Id = --LastTempId;
}
}
public class Model1 : ModelBase
{
public Model1 () : base ()
{
// do something model1-specific
}
}
public class Model2 : ModelBase
{
public Model2() : base()
{
// do something model2-specific
}
}
Если я реализую это таким образом, я опасаюсь, что для обоих подклассов model1
и model2
унаследованное статическое свойство LastTempId
будет одним и тем же экземпляром. Но мне нужен отдельный счетчик для каждого подкласса, но я все еще использую его в конструкторе базового класса.