2007-10-30
两个类实现同一个接口如何共享某些方法的实现?
这个设计具体该如何实现?当前有一个接口IValidatable和两个需要实现这个接口的类Composite,Dialog
现在在一个GUI(SWT)程序的设计中有两种类型的对象需要实现这个接口,
一个是Composite的扩展类ValidatableComposite,
一个是Dialog的扩展类ValidatableDialog(Composite and Dialog都非接口而是实际类).
假定这两个类内部对
public void addValidator(IInputValidator validator);
public List<IInputValidator> getValidators();
public void addValidators(IInputValidator[] validators);
三个方法的的实现是一致的.
请问有什么办法可以避免在ValidatableComposite和ValidatableDialog重复实现那三个方法?
public interface IValidatable{
public boolean isValid();
public void computeValid();
public void addValidator(IInputValidator validator);
public List<IInputValidator> getValidators();
public void addValidators(IInputValidator[] validators);
}
现在在一个GUI(SWT)程序的设计中有两种类型的对象需要实现这个接口,
一个是Composite的扩展类ValidatableComposite,
一个是Dialog的扩展类ValidatableDialog(Composite and Dialog都非接口而是实际类).
假定这两个类内部对
public void addValidator(IInputValidator validator);
public List<IInputValidator> getValidators();
public void addValidators(IInputValidator[] validators);
三个方法的的实现是一致的.
请问有什么办法可以避免在ValidatableComposite和ValidatableDialog重复实现那三个方法?
评论
yongyuan.jiang
2007-11-02
如daniel.wuz所言
使用组合,代替继承,将实际逻辑算法抽象到DefaultValidatable 类中,
派生类使用DefaultValidatable接口,这是Bridge模式:一组派生类(Composite等),使用一组实现(本例只有一个实现)。
这里体现了组合优于继承原则。
使用组合,代替继承,将实际逻辑算法抽象到DefaultValidatable 类中,
派生类使用DefaultValidatable接口,这是Bridge模式:一组派生类(Composite等),使用一组实现(本例只有一个实现)。
这里体现了组合优于继承原则。
daniel.wuz
2007-11-02
忘了模式名了
接口:
标准实现:
Composite:
接口:
public interface IValidatable {
public boolean isValid();
public void computeValid();
//以下三个方法在子类中的实现是一样的
public void addValidator(IInputValidator validator);
public List<IInputValidator> getValidators();
public void addValidators(IInputValidator[] validators);
}
标准实现:
public class DefaultValidatable implements IValidatable {
@Override
public void addValidator(IInputValidator validator) {
}
@Override
public void addValidators(IInputValidator[] validators) {
}
//实现三个方法
@Override
public void computeValid() {
System.out.println("say hi to every one");
}
@Override
public List<IInputValidator> getValidators() {
return null;
}
@Override
public boolean isValid() {
return false;
}
}
Composite:
public class Composite extends Component implements IValidatable {
private IValidatable defaultvalidate = null;
public Composite(){
this(new DefaultValidatable());
}
public Composite(IValidatable defaultvalidate){
this.defaultvalidate = defaultvalidate;
}
@Override
public void addValidator(IInputValidator validator) {
}
@Override
public void addValidators(IInputValidator[] validators) {
//委派给标准实现
defaultvalidate.addValidators(validators);
}
@Override
public void computeValid() {
// TODO Auto-generated method stub
}
@Override
public List<IInputValidator> getValidators() {
// TODO Auto-generated method stub
return null;
}
}
chbest
2007-11-02
10916621 写道
不能使用抽象类么?
我觉得抽象类就解决了
10916621
2007-11-02
不能使用抽象类么?
timonzhang
2007-11-01
liusu 写道
silentlakeside 写道
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。
也就是最终还是要实现这些方法两遍?
不懂LZ的意思,这里实现方法的只有第3个类.
jimmy_c
2007-10-31
IValidatable中extract一个IValidatorList接口,定义一个DefaultValidatorList派生于IValidatorList,实现公用的代码部分。
ValidatableComposite和ValidatableDialog通过代理模式使用DefaultValidatorList实现IValidatable中对应的接口。
ValidatableComposite和ValidatableDialog通过代理模式使用DefaultValidatorList实现IValidatable中对应的接口。
lsy
2007-10-31
新建一个类实现这三个方法,并将其引入到ValidatableComposite和ValidatableDialog中。
mreay
2007-10-30
建议看看head first设计模式此书,第一章就可以解决此问题了!
liusu
2007-10-30
silentlakeside 写道
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。
也就是最终还是要实现这些方法两遍?
silentlakeside
2007-10-30
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。
kaneg
2007-10-30
可惜Java只能单继承,貌似做不到
liusu
2007-10-30
Composite,Dialog是SWT库中的类,我只能使用不能对其进行更改.
其实就是这样:
我的
,同样
这样ValidatableComposite和ValidatableDialog就没有办法同时继承另外一个AbstractValidatable 类了.
其实就是这样:
我的
ValidatableComposite extends Compsite implements IValidatable
,同样
ValidatableDialog extends Dialog implements IValidatable
这样ValidatableComposite和ValidatableDialog就没有办法同时继承另外一个AbstractValidatable 类了.
hyhongyong
2007-10-30
定义一个Composite,Dialog的共通抽象父类实现接口中的三个方法。
JaNer
2007-10-30
父类B实现接口A,子类CD继承父类B,这样不可以么.愚见!
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 4754 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
两个类实现同一个接口如何 ...
如daniel.wuz所言 使用组合,代替继承,将实际逻辑算法抽象到Defaul ...
-- by yongyuan.jiang -
两个类实现同一个接口如何 ...
忘了模式名了 接口: public interface IValidatabl ...
-- by daniel.wuz -
两个类实现同一个接口如何 ...
10916621 写道不能使用抽象类么? 我觉得抽象类就解决了
-- by chbest -
两个类实现同一个接口如何 ...
不能使用抽象类么?
-- by 10916621 -
两个类实现同一个接口如何 ...
liusu 写道silentlakeside 写道另外建一个类,该类实现这些验证 ...
-- by timonzhang






评论排行榜