Нет, абстрактные или виртуальные статические методы не имеют смысла - но вам это тоже не нужно.Просто удалите абстрактный метод load()
из DataPacket
, и код будет работать так, как вы ожидаете.
Почему нет смысла иметь виртуальные статические методы?Поскольку статические методы всегда вызываются через ссылку на класс, а не через ссылку на объект.Даже если можно написать foo.staticMethod()
, где foo
- переменная объявленного типа Foo
, вы действительно вызываете Foo.staticMethod()
, даже если foo
действительно ссылается на экземпляр SubclassOfFoo
.
Если вам действительно нужно вызвать статический метод, основанный на фактическом типе некоторого объекта (в отличие от объявленного типа переменной, которая ссылается на объект), вам нужно создать нестатический метод, который вызываетсоответствующий статический метод и переопределите его в подклассах.