2013-02-17 105 views
2

我要声明的接口是使用与几类
此类有方法用不同的参数
与不同方法的接口参数

接口:

public interface Operation { 

public int Add(); 

} 

A类:

public class CLASSA implement Operation{ 

    public int Add(int id,String name); 

} 

B类:

public class CLASSB implement Operation{ 

    public int Add(String name); 

} 

如何推动这个接口?

+9

如果他们有不同的参数,那么他们没有使用相同的接口! – 2013-02-17 13:39:57

+0

我不认为有这个问题的一个合适的答案为是没有接口的使用权。但是,如果您提供信息,为什么要这样做,可能有另一种方法来解决您的问题。 – Zhedar 2013-02-17 13:47:40

+0

就目前而言,这无法以合理的方式回答。请描述为什么**你需要这样做(即你打算如何使用这个假设的接口)。 – 2013-02-17 14:01:16

回答

7

你可以把操作数对象

public interface Operation { 

public int Add(Operand o); 

} 

public interface Operation { 

public int Add(Operand... o); 

} 
+1

这是如何解决问题的? – Zhedar 2013-02-17 13:42:15

+0

现在你可以使用这个接口 并模拟不同的参数 没有其他方式来做到这一点,因为否则,你将需要不同的接口 – cIph3r 2013-02-17 13:43:42

+1

这提供了灵活性,但需要额外的类型检查,但这可能是一些必要的权衡所以这是一个有用的解决方案。这也意味着你可以在操作数的子类中进行操作,并在该接口的实现中为该子类添加逻辑,从而允许传递任何类型的参数。但是请注意,如果这个名称确实是该类的名称,那么'Operands'应该读取'Operand'。 – 2013-02-17 13:52:55

0

你不能做这样的。如果界面操作是你的(不是预定义的或者其他人),那么在其中就有重载的抽象方法。这是唯一的方法。

0

最好尝试一下:

public interface Operation { 
    public int add(); 
} 


public class SimpleOperation implements Operation { 

    @Override 
    public int add() { 
     return 0; 
    } 

    public int add(int id, String name) { 
     return id; 
    } 

} 

在使用时:

Operation op = new SimpleOperation(); 
op.add(); // Valid 
op.add(2, "two"); // Invalid 

基本上,虽然你也可以添加方法到类,如果它不存在中那么如果你调用它的实例是该接口的话,你就不能调用它。

这是有效的,但是由于该实例SimpleOperation类,其具有重载方法声明的:然而

SimpleOperation op = new SimpleOperation(); 
op.add(); // Valid 
op.add(2, "two"); // Also valid 

这减少的接口的有效性。如果你热衷于重载方法,可以考虑使用一个抽象超类,并定义这两个方法并在你的子类中重写它们。或者,将原始方法和重载方法都添加到界面中。

在你没有使用相同的接口这种情况下
+0

但现在,你的界面我们也没用,因为 添加(INT,字符串)不在这里定义... 也,Java的惯例告诉我们使用小写的方法名加() – cIph3r 2013-02-17 13:47:27

+2

这是如何解决问题的? – 2013-02-17 13:47:39

+0

@ cIph3r你是完全正确的,没有注意到。 OP也不应该在班级名称上使用全限额。 – 2013-02-17 13:50:34

1

,但你可以创建一个世袭制度中的一些参数自动插入:

public class CLASSA{ 
    public int Add(int id,String name){ 
     //something 
    } 
} 

public class CLASSB extends CLASSA{ 
    public int Add(String name){ 
     super.Add(this.FIXED_ID, name); 
     //something 
    } 
} 

public class OPERATION extends CLASSA{ 
    public int Add(){ 
     super.Add(this.FIXED_ID, this.FIXED_NAME); 
     //something 
    } 
} 
+0

但是请注意,在子类中添加额外的细节通常会更好,并且不会将它们带走,因为任何修改都会导致所需的维护工作量减少。 – 2013-02-17 13:58:23

0

这是一个坏主意,它违反了面向对象的设计和想法在界面后面。应该使用一个接口来抽象出实现中的方法调用。

我的建议是在接口中使用带有两个参数的方法,并且不要在CLASSB中使用ID参数,也不要在接口中使用ID方法,并且每个类中只有不同的版本。

0

两种解决方案
无论是定义在该接口两种方法:

public interface Operation { 

public int addName(String name); 
public int addIdName(int id, String name); 

} 

或使用通用放慢参数

public interface Operation { 

    public int add(HashMap<String,String> keyValueParams); 
} 

但对于操作这应该工作不同。