假设我有一个基于NSObject的Deck类。我们还有PlayingCardDeck,它是基于Deck类的。
下面的方法如何合法?
-(Deck *) createDeck
{
return [[PlayingCardDeck alloc]init];
}
假设您对对象继承进行了正确的编码:是的,这是合法的,因为您的PlayingCardDeck确实是一个Deck。
是的,一个方法可以返回不同的类型,只要它与指定的类型兼容。
我们有基于
Deck
类的PlayingCardDeck
。
那么返回一个PlayingCardDeck
的实例是完全可以的,因为它是一个Deck
。
这项技术在面向对象编程中非常重要和流行。它允许您隐藏实现,并公开接口。例如,您可以实现Deck
的几个实现,但只让用户知道顶级Deck
类。这使您可以在不破坏用户代码的情况下灵活选择实现。
Cocoa框架也大量使用这个概念。例如,用NSString
的返回类型声明的NSString
的一些方法实际上返回了NSString
的一个子类。由于用户代码不需要知道子类,他们可以方便地编写NSString
,并对其接口进行编程。