Inheritance is more, а не просто сдача расширяет в декларации определенного класса.
Например, ваши классы должны следовать за Liskov substitution principle. И этот принцип дает правила, как должно выглядеть переопределение методов.
Фактически это позволяет узким типам возвращаемых значений; например: базовый класс имеет Number getFoo()
; и подкласс может делать Integer getFoo()
. Но в вашем случае типы возврата: разные; поэтому ваша идея просто неверна на концептуальном уровне!
Обоснование этого. Если у вас есть клиентский код, который вызывает этот метод, то клиент должен не должен знать, вызывает ли он этот метод в базовом классе ... или какой-то подкласс. Другими словами: клиентский код должен иметь возможность обрабатывать ответ «Число», поэтому, конечно, он сможет иметь дело с возвратом целого. Теперь подумайте, как это должно работать в вашей настройке ... как сказано: это не так!
И только для полноты: LSP говорит, что возвращение типы могут быть сужены , в то время как параметры метода могут быть расширены. Поэтому, когда base foo() принимает Integer, подкласс foo() отлично подходит для Number.
Расширяет ли 'SpecialFooType'' FooType'? – bradimus
@bradimus № FooType - это просто его собственный класс. Но я хочу, чтобы у него были другие свойства, если вы получаете FooType из этого конкретного дочернего класса, которые определены в интерфейсе SpecialFooType. Другими словами, я хочу, чтобы getFoo() в дочернем классе возвращал то, что является как FooType, так и SpecialFooType. – KaliMa
Вы не можете этого сделать, так как 'SpecialFooType getFoo()' и 'FooType getFoo()' будут отличаться только от типа возврата. У них будет такая же подпись. Вы могли бы это исправить, если «ParentClass» были родовыми. – bradimus