Это действительно хороший момент, и иногда abstract static
действительно отсутствует.
Однако, поскольку в настоящее время память не является проблемой, вы, безусловно, можете реализовать getNumberLegs()
-метод в качестве метода экземпляра.
Сказать, что статическое резюме не имеет смысла, не соответствует действительности. PHP допускает абстрактные статические методы (см. this ), и ваш сценарий показывает, что это может быть полезно в некоторых ситуациях.
Также неверно утверждать, что static
методы не могут быть переопределены; final
методы не могут быть переопределены. В таких языках, как Java и C #, static
поставляется с final
. Вот почему многие предполагают, что static
равно «не переопределить».
Говоря о C # (после прочтения ваших комментариев, я полагаю, вы «говорите» на C #), вы можете подумать об использовании обобщений и атрибутов (или обобщений и аннотаций в Java):
public class Animal
{
public static int GetNumberOfLegs<T>() where T : Animal
{
//Get T's custom attribute "NumberOfLegs" and return its value
}
//EDIT: Added runtime-version of GetNumberOfLegs.
public static int GetNumberOfLegs(Type t)
{
//Get t's custom attribute "NumberOfLegs" and return its value
}
}
[NumberOfLegs(4)]
public class Cat { ... };
Это позволит вам получить количество ног каждого типа, не создавая его. Просто не забудьте указать атрибут [NumberOfLegs(x)]
. Вы также должны знать тип во время компиляции (для общей версии метода).
EDIT: я добавил во время выполнения версию GetNumberOfLegs()
-метода, к которому вы можете передать объект Type
(должен быть Class
для Java). В этом случае вам нужно будет выполнить проверку типа во время выполнения, то есть проверить, наследуется ли тип, представленный объектом Type
- / Class
, от Animal
, а затем извлечь значение, переданное в атрибуте / аннотации.
Использование:
int numberOfLegs1 = Animal.GetNumberOfLegs<Cat>();
int numberOfLegs2 = Animal.GetNumberOfLegs(typeof(Cat)); //runtime version