关于设计上的一个问题,大家都来看看(300分)

  • 主题发起人 主题发起人 wk_knife
  • 开始时间 开始时间
W

wk_knife

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一个类,它维护着一个其他对象实例列表,在这个对象列表中有几个对象应该在这个类被实例化的时候就由程序来生成,以后的这个列表中的其他对象都由用户生成。
问题是一般情况下,由类一开始创建的几个对象一般是不能被从删除(也就是释放),但个别情况下却需要这么做。
我应该如何设计这个类呢?
 
类工厂模式
定义类引用,采用在窗体的initialization注册类列表。
最好采用接口,不用的时候自动释放。
 
我可能是没说清!
我现在有一个类A,它维护着一个其他对象实例列表List,在这个对象列表中有几个对象(b1,b2)应该在这个类A被实例化的时候就由程序来生成,以后的这个列表中的其他对象(b3...bn)都由用户生成。
问题是一般情况下,由类一开始创建的几个对象(b1,b2)一般是不能被删除(也就是释放),但个别情况下却需要这么做。
如果把B1、B2聚合到A中,就不容易作到由用户释放、并不产生异常,而且按这种设计,以后就容易产生派生的子类太多。
 
问题是一般情况下,由类一开始创建的几个对象一般是不能被从删除(也就是释放),但个别情况下却需要这么做。
//这样没什么问题啊,释放就释放啊,没什么关系的吧?不明白你的意思
你可以多定义一个带参数的构造函数,如果是实例化以后的对象的就应该使用带参数的构造函数,这样好多属性就不是初始时的内容了
 
我在做一个绘图程序。同大多数书上讲的一样,所有的图元类都继承自一个基类
在这里我应用了一个模式,COMPOSITION,
class A
private
List:TList //一个图元类的列表
public
//对列表项的添加,删除等操作
end;

这样就可以由简单的图元组合出复杂的图元。但后来我想到一个问题。
我从抽象类继承了一个子类,假设这个子类是一个在左上角带标题的方框,然后用户可以通过操作给它添加新的图元,新的图元添加到这个方框类的列表中。这个带标题的方框类我是这样定义的。
class rectwithText
private
class Text;
//标题
由方框(画方框的函数)和文字图元类组成。
现在问题是这样的,有时候这个标题是不需要的。但默认应该由程序生成出来,让用户决定要不要。
这时我就有几种考虑:
1、让rectwithText单独维护这个标题对象,负责它。由于程序中有很多这样的情况,这样子类就要多得爆炸了。而且代码的可复用性差
2、把标题对象也加入到LIST列表中,这样用户操作容易,但类难写,容易出错。
3、使用PROTOTYPE模式,动态维护和克隆类。由于类采用这种COMPOSITION模式定义,克隆它的操作要比较麻烦。
希望得到大家的帮助!谢谢。
 
按你的COMPOSITION,我觉得应该是标题和方框加到类A的List中,
你新做的这个类rectwithText和类A是什么关系呢?
 
是类A的子类。
确实如你所说,是应该放到LIST里,但是如果用户删掉了这个标题,那么你的其他的一些方法,比如绘制,在绘制前都要先判断这个标题是否还存在。这样不是比较容易出问题。
 
rectwithText=class A
private
List:TList //标题+矩形框
是不是应该这样?
rectwithText负责管理text标题类是否存在
 
76liujing,你会采用什么方法来做类似的程序?
 
我也没做过类似的绘图程序,不过我认为用COMPOSITION模式时,
带List的组合对象和不带List的对象的执行绘图的调用方式都
应该是一致的,你想设计的rectwithText类是否已经偏离了
COMPOSITION模式的范围了?
 
这样做是因为它需要提供一些组合好的图元供用户使用。
如何提供这些组合好的图元,是我的问题所在——派生子类还是用原型模式
而且事先提供的组合图元在其行为方式上也有些需要自己定义的地方,这个代码是要写进去的。
 
我觉得可以用派生子类的方法!
但是你说代码复用性差是怎么回事呢?
如果继承关系设计得好,需求又固定的话,代码复用应该可以的呀!
 
用原型模式搞定了。
 
多人接受答案了。
 
后退
顶部