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

本文通过一个具体的自然数类设计案例,讨论了在特殊情况下父类依赖子类的设计方式,并提出这种做法虽不常见但有时却是必要的。文章同时探讨了这种设计可能带来的问题及其适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值