抛弃依赖倒置原则中,yqj2065对“抽象不应该依赖细节。细节应该依赖抽象”,描写成“一个毫无价值的废话,都能够包装成令很多人脑洞大开的原则”。
但是,凡事都有例外。
虽然极其罕见,有时候父类型需要事先知道其子类型。这是一种什么样的感觉呢?
我们看一个例子。定义自然数
package closure.style; public abstract class Num { @Override public String toString() { return "zero"; } } public final class Zero extends Num{} public final class NextOne extends Num{ Num pre;//predecessor NextOne(Num pre){ this.pre = pre; } @Override public String toString() { return "new " +NextOne.class.getSimpleName()+ "(" + pre + ")"; } } //class Demo public static void testNum() { Num n = new NextOne( new NextOne( new NextOne(new Zero()))); pln(n); }这样的设计很普通。
假设,我们不想要Zero这个类,而是将它设计成Num 的静态成员,就会在父类型中出现子类型的名字——父类型依赖子类型。
public abstract class Num { public static Num zero = new NextOne(null); }【有人说,你为什么不把zero作为NextOne的静态成员?哈,如果那样,怎么体现父类型依赖子类型呢,那不是没得玩了。】
父类型需要事先知道其子类型,的确是一个糟糕的设计体验。如果还和违反LSP搞在一起,就更糟糕。
但是,在特定情况下,这种搞法是没有办法的办法。
(作业题:请举出一个非常典型的例子。提示:WCF)
(放在4.1.1)
原文链接:https://www.f2er.com/javaschema/283071.html