我刚看到一个像这样的成员函数:
public Cat nextCat(GameState state);
但Cat是这样的界面:
public interface Cat {
void makeCat(GameState state);
}
所以我很困惑如何解释这个。我知道当某些东西返回一个对象或一个原语时它意味着什么。但是返回界面意味着什么?如何使用此函数的返回值?
答案 0 :(得分:35)
想一想:如果Cat
在常规课程中,那么当您想要调用某些方法时,您会关注什么完全?
你关心方法定义:它们的名称,它们的参数类型,它们的返回值。您不需要关心实际实施!
由于界面提供了所有这些,您可以在其上调用方法,就像在普通类上一样。
当然,为了让方法实际返回某个对象,需要有一些类实现该接口某处。但实际上是什么类或如何它实现这些方法对于获得该对象返回的代码并不重要。
换句话说,您可以编写如下代码:
Cat cat = nextCat(GameState.STUFF);
cat.makeCat(GameState.OTHER_STUFF);
该代码不了解实现Cat
接口的具体类型,但它知道该对象可以执行Cat
接口所需的所有操作。
答案 1 :(得分:8)
此函数返回实现Cat接口的类的对象。只要您为它实现Cat接口的所有方法,实现细节(对于此具体类)由您决定。
答案 2 :(得分:4)
例如,你可以这样做:
interface Cat {
String meeeeow();
}
public Cat nextCat(GameState state) {
return new Cat() {
public String meeeeow() {
return "meeeeeeeeeow!!!!";
}
};
}
在这种情况下,方法nextCat通过'anonymous-inner-class'返回Cat接口的实现。这表明调用nextCat的代码不需要知道哪个代码实现了返回的Cat接口。这是面向对象编程的一个关键优势的示例:因为调用代码不知道实现,稍后更改实现的影响很小(只要接口保持不变)。
答案 3 :(得分:3)
这是abstration的一种方式,"Hiding Actual implementation"
,最佳示例是Map
接口,如果某个API的返回类型为Map
,那么用户实际上不需要关心对象实现的类型,即'Hasmap for Hashtable',借助Map
接口中定义的方法,用户可以对返回的对象执行操作,因为接口与“实现类必须提供的实现类创建契约”声明方法的定义“否则声明实现类为abstract
。
答案 4 :(得分:1)
方法可以返回任何内容(void),或原始值int,double,...),或者null或引用实例的引用。当一个方法返回一个引用时,它就是 声明为返回对某种特定对象的引用。
在您的情况下,此方法返回的引用将为null或将引用其类实现Cat的对象
答案 5 :(得分:1)
方法不返回 interfaces 或 classes 。它们将引用返回给实例(= object)或null
(或原始值,但让我们坚持使用对象)。此引用通常存储在变量中或用于调用实例方法或访问实例成员。
声明的返回类型告诉我们实例的最小特定类型,其引用由方法返回。该引用背后的对象可能正是该类型或任何子类(或子子类,...)。
答案 6 :(得分:0)
当您不需要了解实现时,可以返回接口以将实现保留给该方法,并且调用者可以使用接口提供的方法。
Cat cat = nextCat(state);
cat.makeCat(state);
答案 7 :(得分:0)
这意味着,成员函数可以返回任何实现。这遵循“程序到接口,而不是实现”。 design pattern
答案 8 :(得分:0)
根据面向对象的定义,接口是一组具有空体的相关方法。接口在类和外部世界之间形成契约,并且该合同在构建时由编译器强制执行。话虽如此,nextCat(GameState state)
返回一个接口Cat,这意味着在运行时它可以返回Implements Cat的任何对象。现在,不灵活吗?
只要对象遵循客户期望的接口,客户端就不会意识到他们使用的特定对象类型。
答案 9 :(得分:0)
值得再次强调的是,拥有类型为接口的变量是完全合法的 - 事实上非常普遍 - 例如:
update cart set productname='hey' where cartid=(select max(cartid) from cart)
请记住,meas引用的对象没有可测量的类型。
在
事实上,没有对象具有可衡量的类型。相反,对象的类型是某些类
实现可衡量的接口。这可能是BankAccount类的对象或
硬币类或其他类。
Measurable meas; //"Measurable" is an interface name.
如果你不知道类的话,你可以用接口变量做什么
它引用的对象?
您可以调用界面的方法:
meas = new BankAccount(1000); // OK
meas = new Coin(0.1, "dime"); // OK
并且您应该知道类和接口类型之间可以存在类型转换器。
答案 10 :(得分:0)
返回接口允许成员函数返回任何已实现类的引用。它为界面编程提供了灵活性,也有助于实现工厂和抽象工厂设计模式。
答案 11 :(得分:-1)
它返回一个实现接口的对象。 有一些示例可供参考: https://blog.csdn.net/hduxiejun/article/details/52853153