`
liusu
  • 浏览: 171344 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

两个类实现同一个接口如何共享某些方法的实现?

    博客分类:
  • Java
阅读更多
这个设计具体该如何实现?当前有一个接口IValidatable和两个需要实现这个接口的类Composite,Dialog

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重复实现那三个方法?
分享到:
评论
14 楼 yongyuan.jiang 2007-11-02  
如daniel.wuz所言
使用组合,代替继承,将实际逻辑算法抽象到DefaultValidatable 类中,
派生类使用DefaultValidatable接口,这是Bridge模式:一组派生类(Composite等),使用一组实现(本例只有一个实现)。

这里体现了组合优于继承原则。
13 楼 daniel.wuz 2007-11-02  
忘了模式名了

接口:
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;
	}

}
12 楼 chbest 2007-11-02  
10916621 写道
不能使用抽象类么?

我觉得抽象类就解决了
11 楼 10916621 2007-11-02  
不能使用抽象类么?
10 楼 timonzhang 2007-11-01  
liusu 写道
silentlakeside 写道
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。

也就是最终还是要实现这些方法两遍?


不懂LZ的意思,这里实现方法的只有第3个类.
9 楼 jimmy_c 2007-10-31  
IValidatable中extract一个IValidatorList接口,定义一个DefaultValidatorList派生于IValidatorList,实现公用的代码部分。
ValidatableComposite和ValidatableDialog通过代理模式使用DefaultValidatorList实现IValidatable中对应的接口。
8 楼 lsy 2007-10-31  
新建一个类实现这三个方法,并将其引入到ValidatableComposite和ValidatableDialog中。
7 楼 mreay 2007-10-30  
建议看看head first设计模式此书,第一章就可以解决此问题了!
6 楼 liusu 2007-10-30  
silentlakeside 写道
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。

也就是最终还是要实现这些方法两遍?
5 楼 silentlakeside 2007-10-30  
另外建一个类,该类实现这些验证方法,然后ValidatableComposite和ValidatableDialog调用该类来实现IValidatable接口。
4 楼 kaneg 2007-10-30  
可惜Java只能单继承,貌似做不到
3 楼 liusu 2007-10-30  
Composite,Dialog是SWT库中的类,我只能使用不能对其进行更改.

其实就是这样:
我的
ValidatableComposite extends Compsite implements IValidatable

,同样
ValidatableDialog extends Dialog implements IValidatable

这样ValidatableComposite和ValidatableDialog就没有办法同时继承另外一个AbstractValidatable 类了.
2 楼 hyhongyong 2007-10-30  
定义一个Composite,Dialog的共通抽象父类实现接口中的三个方法。
1 楼 JaNer 2007-10-30  
父类B实现接口A,子类CD继承父类B,这样不可以么.愚见!

相关推荐

    继承接口与多态--矩形类和正方形类中实现此接口,用来实现斜边的计算。

    在Java中,接口是一种强制实现特定方法的合同,它可以被类来实现,以确保类具备某些预定义的行为。 标题提到的是通过继承接口和多态来实现矩形类(Rectangle)和正方形类(Square)对对角线长度计算的功能。接口`...

    抽象类与接口的区别

    - **抽象类**:适用于定义共享行为和状态的场景,如定义一个基础类来共享某些通用行为。 - **接口**:适用于定义行为规范的场景,如定义一组操作规则而不关心具体实现细节。 5. **灵活性**: - **抽象类**:提供...

    JAVA中抽象类与接口的区别

    1. **多继承支持:** 一个类可以实现多个接口,解决了Java不支持多重继承的问题。 2. **完全抽象:** 接口中所有的方法都是抽象的,不允许包含任何实现细节。 3. **常量定义:** 接口中的变量默认是`public static ...

    抽象类和接口

    - 一个类可以实现多个接口,支持多重继承的概念。 - 接口中的方法默认是没有实现的,但自Java 8起,接口可以包含默认方法和静态方法。 **应用场景**: - 当需要定义一组行为规范,但不确定谁会实现这些规范时,可以...

    接口与抽象类

    接口与抽象类是面向对象编程中的两个核心概念,它们都是为了实现代码的重用性和灵活性而设计的。本文将详细探讨接口与抽象类的区别,并结合实际编程场景来分析何时使用接口、何时选择抽象类。 #### 二、接口的基本...

    抽象类和接口1

    然而,`final`和`abstract`关键字不能同时用于同一个类或方法,因为它们的性质相互矛盾:`final`类不能被继承,而`abstract`类必须被继承;`final`方法不能被重写,而`abstract`方法必须被重写。 接下来,我们讨论...

    接口和抽象类的区别_--相信你看完不会再混淆了

    例如,如果一个类实现了`IPerson`接口,那么这个类就必须包含一个名为`Eat()`的方法,以符合“人能吃饭”的自然规则。通过这种方式,接口确保了实现它的类具有共同的基本行为,从而使得其他类可以基于这些共有的行为...

    C#接口与抽象类的详解

    3. 类可以多重实现接口,但只能单继承(直接继承)一个抽象类或类。 4. 接口支持回调,而继承通常不支持这一特性。 5. 抽象类不能被密封,这意味着它的子类可以继续被继承。 6. 实现接口的方法默认是非虚的,而抽象...

    关于C#接口的用途及其使用方法

    在这个例子中,`jieKou` 接口定义了两个方法 `add()` 和 `delte()`,而 `test_Interfacel` 类实现了这两个方法。这表明任何实现了 `jieKou` 接口的对象都将拥有添加和删除的功能,但具体实现细节由各自类来决定。 #...

    JAVA:抽象类和接口

    1. **模板方法模式**:通常使用抽象类来实现模板方法模式,其中抽象类定义了一个算法骨架,允许子类提供特定步骤的具体实现。 2. **策略模式**:在策略模式中,接口用于定义一组可互换的算法或行为,客户端可以选择...

    抽象类及接口的实例及测试

    在编程世界中,抽象类和接口是面向对象编程(OOP)中的两个核心概念,它们为代码设计提供了灵活性和可扩展性。在这个“抽象类及接口的实例及测试”项目中,我们可以通过源代码和UML(统一建模语言)图来深入理解这两...

    两个Fragment在同一个Activity上的交互1

    两个Fragment可以通过共享同一个ViewModel来进行数据交换。 6. **使用MediatorFragment**:创建一个中间的MediatorFragment,让它来协调两个Fragment的通信。这种方式可以避免直接耦合,但增加了代码复杂性。 在...

    C#中的接口和抽象类

    1. 实现方式:类可以实现多个接口,但只能继承一个抽象类。接口提供的是横向扩展,抽象类提供的是纵向继承。 2. 内容:接口只能包含方法签名,而抽象类可以包含字段、构造函数、方法等成员。 3. 默认访问修饰符:...

    Java 接口和抽象类区别

    例如,`javax.ejb.SessionBean` 是一个接口,定义了Session Bean必须实现的一些基本方法,而EJB的某些实现可能提供抽象类,如`AbstractSessionBean`,来简化开发过程。 标签“源码”和“工具”提示我们,理解这些...

    抽象类和接口的区别相关信息

    使用抽象类的主要目的是定义一个公共的接口,强制子类必须实现某些方法,从而确保所有子类都有相同的行为特征。 例如,在面向对象的设计中,假设有一个"车辆"的抽象类,它可能包含抽象方法如"启动"和"停止",而具体...

    接口抽象类例子,自己备份,别人看了没有用

    在编程领域,接口和抽象类是面向对象设计中的两个关键概念,它们用于实现代码的抽象和多态性。本文将详细探讨这两个概念以及它们在实际编程中的应用。 首先,我们来理解“接口”。接口在Java、C#等编程语言中扮演着...

    抽象类与接口[借鉴].pdf

    在软件开发中,抽象类和...如果需要共享代码或强制实现某些方法,那么抽象类是好选择;若要实现多重继承效果或定义一组方法的契约,接口更为合适。理解并灵活运用这些概念,对于编写高质量的、易于维护的代码至关重要。

    JAVA抽象类和接口讲义PPT教案学习.pptx

    - 当只需要一个对象实例,并且这个对象只用到一次时,可以使用匿名类创建,比如直接在实现接口的地方创建一个匿名类对象。 在实际编程中,正确理解和使用抽象类和接口能有效提高代码的灵活性、可维护性和可扩展性...

Global site tag (gtag.js) - Google Analytics