Я бы усомнился, что существуют "веские причины" для того, чтобы сделать абстрактные элементы статичными.
Если вы думаете, что эти члены могут отражать какое-то свойство самого производного класса, а не данного экземпляра, это не обязательно означает, что члены должны быть статическими.
Рассмотрим свойство IList.IsFixedSize
. Это действительно свойство типа из IList
, а не какой-либо конкретный экземпляр (т. Е. Любой T[]
будет иметь фиксированный размер; он не будет варьироваться от одного T[]
к другому). Но все равно это должен быть экземпляр члена. Зачем? Поскольку , поскольку может реализовывать несколько типов IList
, он будет изменяться от одного IList
к другому.
Рассмотрим некоторый код, который принимает любой MyAbstractClass
(из вашего примера). Если этот код спроектирован должным образом, в большинстве случаев его не должно волновать, с каким производным классом он на самом деле имеет дело. Важно то, что MyAbstractClass
разоблачает. Если вы сделаете некоторые абстрактные элементы статичными, то в основном единственный доступ к ним будет выглядеть так:
int magicId;
if (concreteObject is MyConcreteClass) {
magicId = MyConcreteClass.MagicId;
} else if (concreteObject is MyOtherConcreteClass) {
magicId = MyOtherConcreteClass.MagicId;
}
Почему такой беспорядок? Это намного лучше, верно?
int magicId = concreteObject.MagicId;
Но, возможно, у вас есть другие веские причины, которые мне не приходили в голову.