凡事都有例外-父类型依赖子类型

前端之家收集整理的这篇文章主要介绍了凡事都有例外-父类型依赖子类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

抛弃依赖倒置原则中,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

猜你在找的设计模式相关文章