Предположим, у меня есть следующий класс:Обработка классов, которые нарушают «принцип замещения Лисков» с использованием метода перегружать
public class MyClass {
/* Note: Timestamp extends date */
public doSomething(java.sql.Timestamp timestamp){
System.out.println("Timestamp");
...
}
public doSomething(java.util.Date date){
System.out.println("Date");
...
}
}
Предположим, что я теперь осуществлять свой код так:
MyClass myClass = new MyClass();
Date realDate = new Date();
Timestamp timestamp = new Timestamp(0);
Date casted = new Timestamp(0);
myClass.doSomething(realDate); // prints Date
myClass.doSomething(timestamp); // prints Timestamp
myClass.doSomething(casted); // prints Date!!!!! What?!
Проблема в том, У меня есть, так как casted
на самом деле не дата, когда я использую ее, не работает.
Помимо: Как правило, подклассы не работает, не должно быть проблемой, однако Javadoc для Timestamp говорит:
Из-за различий между классом Timestamp и классом java.util.Date упомянутого выше, рекомендуется, чтобы код не отображал значения Timestamp в общем виде как экземпляр java.util.Date. Отношение наследования между Timestamp и java.util.Date действительно означает наследование реализации, а не наследование типов.
Я знаю, что я мог бы сделать что-то вроде этого:
public doSomething(java.util.Date date){
if(date instanceof type){
System.out.println("Timestamp");
...
}
System.out.println("Date");
...
}
Но это только кажется противным.
Есть ли способ получить метод перегрузки подклассов для работы без использования гигантских операторов switch?
Edit: Короче говоря, кажется, что Timestamp
перерывов Liskov substitution principle - как указывал @Mick Mnemonic.
Это ошибка, так как перегрузка метода работает правильно. Перегрузки метода выбираются во время компиляции, а не во время выполнения. –
(Кроме того, это обычно считается серьезным запахом дизайна для 'foo (подтип)', чтобы вести себя иначе, чем 'foo (supertype)', именно по этой причине.) –
@LouisWasserman - я не думаю, что это ** мой * * дизайн ошибка есть. Я считаю, что автором временной метки является автор ошибок. Это и ваше чтение? – sixtyfootersdude