昨天我问了这个问题,@JB Nizet 发布的解决方案效果很好。然而,这个答案以及其他一些答案/评论让我完全想到了一个不同的方向。
本质上,我有以下课程:
Load
HttpLoad extends Load
Target
HttpTarget extends Target
Controller
的Controller
工作是Target::fire()
a Load
,并不关心哪个Target
在触发哪个Load
:
// Inside Controller.java
Target target = getTarget();
Load load = getLoad();
target.fire(load);
但是,有一天我可能会写 a FtpLoad extends Load
,但我不希望能够在 aFtpLoad
上触发 a HttpTarget
。所以上面提到的问题的本质是我该怎么做,答案是泛型。
但是,正如回答者指出的那样,这种解决方案违反了 Liksov 替换原则。其他回答者/评论者似乎表示我所做的不一定是好的 OOP 实践。
所以现在我要问:我如何公开一个 API,以便Controller
可以Load
- 并且 -Target
不可知,但仍然强制在正确的类型Load
上触发正确的子类Target
,所有这些都不会违反 Liskov Substitution?
而且,如果这是不可能的(不违反 Liskov),那么解决此类问题的正常方法是什么?提前致谢!