OOP如何判断从实现的接口调用哪个类方法

时间:2012-10-11 17:33:32

标签: java spring oop

如果你有一个名为A的接口,它有一个名为print的方法签名;现在,如果您有3个实现A的类,并且您调用A.print,您如何知道调用哪个类方法。没有新的对象

public interface A()
{
  public void print(){}
}
@Component
public class B implements A
{
 public void print()
 {
   system.out.print("B");
 }
}
@Component
public class c implements A
{
 public void print()
 {
   system.out.print("C");
 }
}
@Component
public class d implements A
{
 public void print()
 {
   system.out.print("d");
 }
}


public class runner()
{
    @Autowired
    private A aThing_;

    aThing_.print();
}

4 个答案:

答案 0 :(得分:3)

接口定义了交互契约,换句话说,定义了实现该接口的每个类应该提供的一组方法。

Oracle对问题的回答是What's an Interface?

  

正如您已经了解的那样,对象定义了它们与之的交互   外面的世界通过他们揭露的方法。方法形成   对象与外界的接口;前面的按钮   例如,你的电视机是你和你之间的接口   塑料外壳另一侧的电线。您   按“电源”按钮打开和关闭电视。

调用取决于实现接口的对象的类型。

A interface = new B();

您将为B界面中定义的print方法调用print A方法的实现。

编辑:接口的关键是定义与对象的交互,而不管其实际类型如何。该代码似乎是对同一界面背后的一组组件进行自动扫描,以表明您可以定义一组不同的组件,以便在给定上下文的情况下以不同的方式处理相同的情况。

AFAIK autowire默认为该字段的名称。您可以使用@Qualifier("CLASS_NAME_HERE")注释以及@Autowire来定义要注入的接口实现。

您可能需要查看this

答案 1 :(得分:1)

它将从对象调用它的类中调用方法版本

A ob = new B(); 
ob.print()// will invoke method from B


A ob = new C(); 
ob.print()// will invoke method from C

查看

答案 2 :(得分:0)

取决于您如何实例化此类对象:

例如

private A aThing = new C();

将调用C打印方法

答案 3 :(得分:0)

如果我正确理解了我们的例子,你就有了一个类Runner,对一个实现A的对象的引用是自动装配的。

界面的重点是多态性。换句话说,在此设计中使用接口A的目的是使Runner不需要知道正在使用哪个实现 - 所有Runner关心的是A上定义的方法是可用的。

你可以在A上设置一个属性,它返回某种类型的信息,但是(我相信有一些例外)会破坏部分目的。