2015-05-12 80 views
1

我需要在我的项目中实现Observers的各种update方法,以便使用特定类型重载Object参数。因此,不是使用Java中的接口内部重载

public void update (Observable o, Object arg0){ 
    if(arg0 instanceof Class1) .... 
    else if (arg0 instanceof Class2) .... 

或开关(它是工作的一个非常“C”的方式),我想使用interface延伸Observer和重载update方法,像这样

public interface ExtendedObserver extends Observer{ 
    public void update (Observable obj, Class1 cls); 
    public void update (Observable obj, Class2 cls); 
} 

然后将其实施到我的观察员。每个不同的观察者都将使用特定的更新方法。

我想知道这是否是工作的正确方式,因为

  1. 我不认为超载的接口内的方法是正确的
  2. 我还是要添加未使用更新方法在实现接口的每个类中。
+1

如果您使用的是Java 8,则可以为所有方法提供空的默认实现,因此您不必在实现者中重新定义所有这些方法。顺便说一句,很高兴知道你想要在这些if-instanceof分支中做什么。可能最好将此功能移到Class1和Class2上? –

回答

1
  • 有超载内部接口
  • 接口的方法没有问题,是一个合同是强制性的实现类 来实现。如果你不想让类实现这个方法。 有没有必要将它包含在接口中。
  • 所以你可以在那些只在需要的地方写这个重载的方法。或者让抽象类实现接口并在其中写入重载方法。
  • 这样你就不会结束暴露不必要的方法合同,其他类
1

你可以尝试改变接口一个抽象类并实现两种方法存在的。另外,请考虑使用泛型。

1

如果你控制Class1Class2,倒不如改变他们是这样的:

interface Updatable { 
    void doUpdate(Observable obj); 
} 

class Class1 implements Updatable { 
    ... 
    void doUpdate(Observable obj) { /*class1-specific code*/ } 
} 

class Class2 implements Updatable { 
    ... 
    void doUpdate(Observable obj) { /*class2-specific code*/ } 
} 

这样,你的主要更新方法是这样的:

public void update (Observable o, Updatable arg0){ 
    arg0.doUpdate(o); 
} 
1

我不认为这是实现接口的正确方式。接口是一个类的特定特征(Scala)。所以如果只有一个参数类型正在改变,我会推荐使用bounded Type Parameters

public interface ExtendedObserver<T> extends Observer{ 
    public void update (Observable obj, T cls); 
} 

如果这对你没有帮助,我会建议你在他们自己的界面中外包特定于类的方法。