关于"不做事"的类

03-05-15 jxb8901
请看下面的类图和问题:

一种解决的方法是将"不做事的类"修改为接口, 由做事的类来继承, 但这种完全颠倒的类层次关系又与真实情况不符, 而且这种设计几乎无法这样的设计变更: "不做事的类"又可能被分配了新的职责.

各位有更好的方法吗?

jxb8901
2003-05-15 11:36
问题的根本在于"Java类的构造器的继承问题".

banq
2003-05-15 18:49
关键看你这样做是想解决什么问题,遇到这种尴尬可能是你的设计还没有抓住本质。

blues
2003-05-17 17:21
不用"继承",用"聚合"的方式

jxb8901
2003-05-19 13:33
使用"聚合"好象是不能解决问题的.

比较倾向banq的观点, 可能是我对问题的本质把握不深, 设计时总感觉思路不够顺畅, 可能只有经过一次或多次的迭代后才能完善设计.

banq
2003-05-19 17:17
把问题 提出来,一起来看看?

jxb8901
2003-05-20 13:50
我把问题重新描述一下, 看附图.

系统从Exception派生了一个AppException作为系统所有其它具体异常的父类, 尽管AppException本身已经是一个功能十分完备的类, 但其名称却没有更具体的含义, 因此当系统中某个模块要抛出自己的异常时, 要求其从AppException再派生一个更具体的异常类, 该类本身的功能可以由其父类AppException来完成, 而另外派生一个异常类的目的只是为了使模块抛出的异常对于用户更有意义.

因为AppException定义了多个构造器,这就造成了所有子类也必须重复定义所有构造器, 而事实上派生类并没有添加额外的功能(也就是我说的"不做事"的类).(不过也不能排除派生类还要添加其它功能的可能性).

magician
2003-05-23 17:33
其实那些异常并不是什么事都没做

他们可以拥有自己定制的出错信息,而不是继承父类的

你可以参照JDK里的异常继承机制

当然,你那样做没有错,不过如果真是那样,还不如只要一个ApplicationException,因为单纯的继承,出错信息都一样。

am i right? maybe ...........

jxb8901
2003-05-23 18:34
我的意思是子类需要写太多与父类相同的构造函数, 你不觉得这很麻烦吗?

另外, 我说过了这些子类在设计初期可能"不做事", 但不能排除以后为其添加新的职责的可能性, 这也是不能使用其它折中方案的原因之一.

jxb8901
2003-05-23 18:43
我的设计已经作了修改, 现在感觉上要好多了.

但我后面举例的情况(异常的层次结构), 其实在其它很多地方也有类似的尴尬出现, 但不见得都是设计问题.

我感觉这种问题应该是语言设计者所要考虑的.

wys1978
2003-05-24 00:08
我不大明白jxb8901的意思, 是嫌这样的设计编码太麻烦吗?

IDE会帮你解决的, 如eclipse, 你可以在create new Class的时候, 选择Superclass, 选择Constructors from superclass.

写一个子类只需要2秒钟, :)

我想jbuilder等其他IDE都应该有这样的功能吧? 看看它生成的代码:

public class CreateException extends AppException {

    /**
     * 
     */
    public CreateException() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @param msg
     */
    public CreateException(String msg) {
        super(msg);
        // TODO Auto-generated constructor stub
    }

    /**
     * @param msg
     * @param nested
     */
    public CreateException(String msg, Throwable nested) {
        super(msg, nested);
        // TODO Auto-generated constructor stub
    }

}
<p>

iceant
2003-05-24 11:12
TO:jxb

设计总是一件很有意思的事,但是实现,确是件麻烦的事。

做程序就是这样,除非你们有专门的 Coding.

做程序就是脑力体力一块干的活~~ :(

jxb8901
2003-05-26 11:47
To: wys1978

我试了一下, JBuilder也有类似的功能. 不过我用的很少, 因为新类一般都是由建模工具生成的.

sswqs
2003-07-02 07:54
用工厂方法代替构造函数

Fish
2003-07-25 09:12
我不明白你说的:子类要重写父类的构造方法 是什么意思? 子类没必要重写父类的构造方法啊。 除非你认为子类的构造方法与父类有不同时才需要重写,不然的话你就调用父类的构造方法呗。有什么不好?

猜你喜欢
2Go 1 2 下一页