@Fjfgs

Как сделать новую static переменную в наследнике? Или как обойтись без этого?

У меня имеется класс Packet, от которого наследуются другие Packet'ы.
public abstract class Packet
{
    public static byte Id;

    public virtual void Write(ref RawPacket packet)
    {
        packet.WriteByte(Id);
    }
}

Как сделать так чтобы для каждого наследника был свой static Id? Пытался выносить Id в Static Generic классы, но тогда метод Write не видит Id.
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
Griboks
@Griboks Куратор тега C#
Вам идеально подойдёт метакласс. К несчастью, шарп не поддерживает метаклассы в достаточном объёме. Поэтому в любом случае придётся делать костыль.

Конкретно в вашем случае подойдёт использование статического словаря/метода:
public static byte GetID(Type packet)
	{
		var ids = new Dictionary<Type, byte>
		{
			{ typeof(ICMP), 1 },
			{ typeof(TCP),  6 }
		};
		return ids[packet];
	}


Если добавить сюда generic, вынести словарь и избавиться от typeof, то получится вполне сносно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
AshBlade
@AshBlade
Просто хочу быть счастливым
Сделай абстрактное свойство, которое будет возвращать нужный Id - переопределяй в наследниках.
А если хочешь получить Id конкретного пакета, то сделай статическое поле для этого класса пакета.
Ответ написан
Комментировать
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
а вы уверенны что хорошо понимаете смысл static?
вам нужен уникальный id для класса? или экземпляра?
подумайте и почитайте доки.
для класса достаточно объявлять readonly а не static

ps а для экземпляра и подавно рандомный readonly

pps по ходу static id предка будет наследоваться для всех. это суть static
Ответ написан
Комментировать
vabka
@vabka Куратор тега C#
Токсичный шарпист
Сделай вместо статического поля - виртуальное нестатическое свойство у которого будет только get.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы