deck
是我的超类,而playingCardDeck
是我的甲板的子类。
我发现我可以通过使用我的子类来实例化我的超类,这让我很困惑。
你能告诉我这个吗。我会使用init
方法以及任何其他有关此事的功能。提前知道。
#import "XYZViewController.h"
#import "PlayingCardDeck.h"
@interface XYZViewController ()
@property (weak, nonatomic) IBOutlet UILabel *flipLabel;
@property (nonatomic) NSUInteger flipCount;
@property (nonatomic) Deck *deck;
@end
@implementation XYZViewController
- (Deck *)deck
{
if (!_deck) {
_deck=[self createDeck];
}
return _deck;
}
- (Deck *)createDeck
{
return [[PlayingCardDeck alloc]init];
}
答案 0 :(得分:1)
这根本不应该令人惊讶。这是非常正常的OOP(它正式称为Liskov substitution principle)。类型为Animal
的对象可以接受Dog
类型的对象。但是你只能在其上调用Animal
方法。
在您的示例中,init
的{{1}}将被执行。访问PlayingCardDeck
的任何人都只能调用deck
上定义的方法,但实施方式将是Deck
提供的方法。