1

如果你有一个名为 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

4 回答 4

3

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

Oracle 对什么是接口?是:

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

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

A interface = new B();

您将为接口中定义的方法调用B'sprint方法的实现。printA

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

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

你可能想检查一下

于 2012-10-11T17:37:35.713 回答
1

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

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


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

于 2012-10-11T17:34:28.193 回答
0

取决于你如何实例化这样的对象:

例如

private A aThing = new C();

将调用C打印方法

于 2012-10-11T17:34:56.283 回答
0

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

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

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

于 2012-10-11T17:42:14.797 回答