Нет, на самом деле нет, потому что Child
является подклассом Father
, а не наоборот.Если бы у вас было
public Child getMe();
Вы могли бы сделать
Father father = c.getMe();
без проблем, потому что вы можете неявно конвертировать в супертип, вы не можете сделать это наоборот.В основном, думайте об этом так.В вашем случае каждый ребенок - это отец, но не каждый отец - это ребенок.Ваше второе решение будет работать, хотя вам придется объявить универсальный тип типа Child
, и это делает его не столько вопросом наследования, сколько вопросом об универсальных типах.
В конце концов, в концедень, как сказал один из комментаторов, если вам действительно нужно точно знать, к какому типу относится экземпляр, возможно, вы делаете что-то не так.Реальное преимущество наследования - это возможность отделить части вашего кода.Код клиента не заботится о том, какова его реализация, он просто знает, какие методы нужно вызвать, чтобы что-то сделать.Конечно, есть некоторые случаи, когда вам нужно привести объект в действие, потому что вам нужно точно знать, какой это тип, но это должно быть редким случаем.В этом случае значение будет определять метод, который принимает объект Father
в качестве параметра и понимает, как работать с интерфейсом Father
.Все необходимые ему методы будут определены как часть класса Father
.Другой код может создавать пользовательские подклассы Father
, которые позволят им расширить функциональные возможности класса, в то же время позволяя им работать с кодом, разработанным для интерфейса Father
.