【问题标题】:Why would I create a property of a superclass only to use the subclass为什么我要创建超类的属性只是为了使用子类
【发布时间】:2013-11-07 19:23:10
【问题描述】:

我正在关注斯坦福在线课程为 iPhone 和 iPad 开发 iOS 7 应用程序 (link to course in itunes U)。

第一个作业要求学生创建笔记中详述的一些类(Card、PlayingCard、Deck、PlayingCardDeck),并更新视图控制器以在一副扑克牌中显示随机卡片。

两个必需的任务包括:

  1. 将 Deck * 类型的私有属性添加到 CardGameViewController。
  2. 使用惰性实例化来分配和初始化此属性(在属性的 getter 中) 所以它从一副完整的扑克牌开始。

我在代码中添加了以下内容:

// CardGameViewController.m
#import "PlayingCardDeck.H"

@interface CardGameViewController ()
...
@property (strong, nonatomic) Deck *deck;
@end

@implementation CardGameViewController
- (Deck *)deck
{
    if (!_deck) _deck = [[PlayingCardDeck alloc] init];
    return _deck;
}
...
@end

提示表示以下内容:

  1. 即使您必须添加的属性类型必须是 Deck(不是 PlayingCardDeck),您显然也必须使用 PlayingCardDeck 懒惰地实例化它。这在面向对象编程中是完全合法的,因为 PlayingCardDeck 继承自 Deck,因此它“是”Deck。如果您对面向对象编程中的这个概念感到困惑,那么本课程对您来说可能相当困难。

PlayingCardDeck 是 Deck 的子类。我知道它“是”套牌。

我不明白为什么要使用 Deck 的属性而不是 PlyaingCardDeck。

【问题讨论】:

    标签: objective-c oop inheritance typing declared-property


    【解决方案1】:

    使用Deck 作为属性类型可以使您的CardGameViewController 更加通用。如果您将来想使用不同类型的卡片组,您只需更改创建卡片组的那一行代码即可。

    此外,如果您只是将该属性公开,则可以使用不同类型的套牌创建不同的 CardGameViewControllers,而不是拥有 PlayingCardDeckGameViewControllerTarotCardDeckGameViewControllerPinochleCardDeckGameViewController 等。

    一般来说,使用Deck 代替PlayingCardDeck 可以为您保留更多选项并提高CardGameViewController 的可重用性。

    【讨论】:

    • 虽然我同意您的解释,但我认为 OP 还指出了一个可能过度概括的重要案例。当你概括一个私有属性以防有一天你公开它时,你可能过度设计了系统,应该简化直到你需要这种抽象级别。
    • 谢谢,这是我一直在寻找的解释,但没有找到。 @Rob Napier您很可能是正确的。这是第一个任务,我希望这个项目将建立在此基础上。该属性可能是私有的,原因稍后会更清楚。
    • 这很好@RobNapier。在这个特定的教室环境中,Paul Hegarty 正在设置这样的东西,因为我认为在另一节课或作业中,他让学生使用其他类型的套牌。所以这是一个奇怪的情况,保罗正在推动设计并且知道他要去哪里,但没有立即与学生分享所有这些信息。
    猜你喜欢
    • 2014-12-20
    • 2017-05-09
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多