【发布时间】:2016-03-25 19:39:10
【问题描述】:
我仍在尝试了解 LSP。据我目前了解,子类/子类型应该能够替换基类/主类型,并且程序应该可以正常工作。
我有以下...
abstract class Warehouse<T> {
private StockLoader<T> loader;
private List<T> stock;
protected setStockLoader(StockLoader loader) {
this.loader = loader;
}
protected List<T> getStock() {
return stock;
}
public void load() {
stock = loader.load();
}
abstract showStock();
}
class WheatWH extends Warehouse<Wheat> {
@Override
public void showStock() {
// Print stocck with getStock() returns Wheat;
}
}
class RiceWH extends Warehouse<Rice> {
@Override
public void showStock() {
// Print stocck with getStock() returns Rice;
}
}
interface List<T> StockLoader<T>() {
public List<T> load();
}
class PlainStockLoader implements StockLoader<Wheat>{
public List<Wheat> load() {
//Code
}
}
class Rice {
.....
}
class Wheat {
....
}
是否违反 LSP?如果不是,在上述程序中什么会违反 LSP? 此外,这是否违反任何其他原则?这可以通过其他方式改进吗?
【问题讨论】:
-
public void showStock() { // Print stocck with getStock() returns Wheat; }void 方法不能“返回小麦”。此外,请务必告诉我们您认为此代码违反 LSP 的原因。 -
我看不到任何违反 LSP 的行为。您认为它的哪一方面可能是违规行为?
-
Warehouse是抽象的有什么原因吗?当类已经是泛型时,为每种不同的内容类型创建一个子类似乎是多余的。 -
@MickMnemonic showStock 对于每种类型的股票应该是不同的。所以我需要强制执行。还有其他方法吗?
-
取决于
showStock应该做什么。您能否通过为每种股票类型(Wheat、Rice等)实现toString(),然后从Warehouse.showStock()调用该方法来实现相同的目标?
标签: java oop generics design-principles