Рассмотрим следующую ситуацию:Специализируется аргументы методов в подклассах в Java
public abstract class AnimalFeed{
}
public class FishFeed extends AnimalFeed{
}
public class BirdFeed extends AnimalFeed{
}
public abstract class Animal{
public void eat(AnimalFeed somethingToEat)
}
Теперь я хотел бы определить класс «Bird» простирающуюся «Animal» быть уверен, что, когда птица ест, он ест только BirdFeed.
Одно решение было бы указать вид договора, в котором вызывающий «съесть» должен пройти экземпляр соответствующего корма
public class Bird extends Animal{
@Override
public void eat(AnimalFeed somethingToEat){
BirdFeed somethingGoodForABird
if(somethingToEat.instanceOf(BirdFeed)){
somethingGoodForABird = (BirdFeed) somethingGoodForABird
}else{
//throws error, complaining the caller didn't feed the bird properly
}
}
}
Приемлемо ли делегировать ответственность Параметром вызывающий? Как заставить вызывающего пройти специализацию параметра? Существуют ли альтернативные дизайнерские решения?
«это очень действует для расширения параметров метода «В общем, но не в Java: вы не можете расширять типы параметров из-за того, как работает разрешение и перегрузка Java-метода. См. Http://stackoverflow.com/questions/18337056/wider-argument-types-of-overridding-method-in-java (хотя я уверен, что есть лучшие Qs и как это). –
Я согласен, что более широкие параметры не нарушают LSP. Я просто говорю, что более широкие аргументы не поддерживаются в java (тогда как более узкие типы возвращаемых типов: тип возврата не является частью сигнатуры метода, используемой для определения того, какой метод вызывается). –
Есть, обновил мой ответ. Хотя мне интересно, почему ваши ответы, кажется, летают в шесть раз лучше моих ;-) – GhostCat