我在以下两种设计之间做出选择。你会推荐哪一种?为什么?
我对第二种方法中在接口中放置get/set方法感到怀疑。你有任何意见吗?
public class Foo {
Time time;
boolean hasTime();
Time getTime() { return time; }
void setTime() { this.time = time; }
}
public class Bar extends Foo {
boolean hasTime() { return true; }
}
public class Baz extends Foo {
boolean hasTime() { return false; }
}
main() {
for (Foo foo : foos) {
if (foo.hasTime()) {
// do something
}
}
}
vs
public class Foo {
}
public class Bar extends Foo implements TimedObject {
Time time;
Time getTime() { return time; }
void setTime() { this.time = time; }
}
public interface TimedObject {
Time getTime();
void setTime();
}
main() {
for (Foo foo : foos) {
if (foo instance of TimedObject) {
// do something
}
}
}
setTime()
将设置任何对象的时间,只要该对象的hasTime()
曾经返回过true
,那么一个对象可以满足这个约定,即使它在setTime()
中不能执行任何有用的操作,只需通过让其hasTime()
方法始终返回false。没有违反LSP(Liskov Substitution Principle)的情况。问题是是否会有包含一些hasTime()
返回true,另一些返回false的集合,并且希望在hasTime()
返回true的对象上使用与时间相关的方法。如果确实希望这样做... - undefinedhasTime()
方法可能更清晰。在某些情况下,可以通过使用hasTime
方法并定义一个继承自Foo
的FooWithTime
类,并重写hasTime()
方法返回true来获得“两全其美”的效果。这将允许在混合集合中以高效的方式使用事物,而无需进行类型转换,同时还可以根据类型验证事物对“时间”函数的支持是否有帮助(在将可能支持这些方法的事物传递给需要它们的事物之前,需要进行强制转换)。 - undefined