繁体   English   中英

返回接口类型的对象的方法

[英]Methods That Return an Object of an Interface Type

像我这样的所有初学者,总是很困惑地看到方法返回接口类型的对象,因为接口具有抽象方法,因此无法实例化。

我终于想出了一种方法来理解这一点:

(((当我们说一个方法返回一个接口类型的对象时,我们实际上是在隐式地说,该方法实际上返回了实现该接口的某个类的对象/实例,但是在大多数情况下,该类是未知的,因为在该方法的实现中声明为匿名。因此,我们将返回的对象称为该接口类型。))。

这个解释正确吗?

“……当我们说某个方法返回接口类型的对象时,我们实际上是在隐式地说该方法实际上返回实现该接口的某个类的对象/实例……”-正确,但是我们在明确地说。

正如@Jon Skeet所指出的,定义的第二部分是非常不正确的。 在实现中应用匿名类是一个非常具体的情况。 通常,返回接口会给您更多自由:

  • 可以更改方法的实现,以返回实现相同接口的另一个对象, 而无需更改使用此方法的代码
  • 您可以扩展类来覆盖该方法,以便它返回实现相同接口的另一个对象。 在这里,您实际上可以更改返回类型。 如果基类的方法返回了具体类,例如ArrayList ,则重写的方法还必须返回ArrayList或其子类。

经验法则如下。 如果具体类实现接口,则返回具体类对象(例如ArrayList )没有好处,返回接口ListCollection 这将增强代码的可维护性,即将来将更易于更改代码。

这是我本月底的生日,所以我为我的所有朋友和家人添加了一种新方法:

public Present givePresent{
    //code to select an appropriate and sufficiently expensive present
    return present;
}

我可以在这里做两件事。 我可以编写一个Present类,并确保所有可能的礼物都对其进行扩展。 但是我们这里可能会遇到各种各样的问题:例如BatmanComic已经从ComicBook继承ComicBook了,因此我们必须不断往前走,直到PresentObject基本上没有区别。 另一种方法是查看此处实际发生的情况。 我希望收到适合特定类别的内容,简而言之,Java有两种方法可以做到这一点。 继承和接口。 Present创建为接口与将其创建为抽象超类的目的完全相同,但是避免了多重继承的所有问题。 这样,我要做的就是编写一个接口:

public interface Present{
}

并确保所有袜子和书本以及其他能够实现的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM