Objective-C在对象可能是超类或子类时访问超类方法

时间:2015-07-29 20:31:24

标签: objective-c inheritance scope

我是一名Objective-C noob,通过一个教程,我想要更好地理解一个奇怪的障碍。

我正在循环制作一个股票对象组合,这些股票对象有50/50的机会成为“外国股票”或只是“股票” - 不同的是转换率属性。对象股票是一个超类,外国股票是股票的子类。

我想创建一个指针,翻转硬币来决定它是哪种类型,然后分配我需要的值。由于子类和超类都有像currentSharePrice这样的东西,为什么我不能在抛硬币之后设置它们呢?

这是我的主要评论:

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // Declare portfolio and set the conversion rate
        BNRPortfolio *mikesPortfolio = [[BNRPortfolio alloc] init];
        NSUInteger globalConRate = 1.2;

        // Array of ticker names - remove them as they are used
        NSMutableArray *tickerNames = [[NSMutableArray alloc] init];
        [tickerNames addObject:@"ibm"];
        [tickerNames addObject:@"ppg"];
        [tickerNames addObject:@"google"];
        [tickerNames addObject:@"vrzn"];
        [tickerNames addObject:@"apple"];
        [tickerNames addObject:@"barq"];

        // Create and add the stocks to the portfolio
        for (int i = 0; i < 6; i++) {

            id newStock;

            // Coin flip to determine type
            NSUInteger randomType = random() % 2;
            if (randomType == 0) {

               newStock = [[BNRStockHolding alloc] init];

            } else {

                newStock = [[BNRForeignStockHolding alloc] init];
                newStock.conversionRate = globalConRate;
            }

            // Assign remaining values
            newStock.purchaseSharePrice = 15 * (random() % i);
            newStock.currentSharePrice = newStock.purchaseSharePrice * 1.4;

            NSUInteger randomTickerValue = random() % [tickerNames count];
            newStock.symbol = tickerNames[randomTickerValue];
            [tickerNames removeObjectAtIndex:randomTickerValue];

            [mikesPortfolio addHoldings:newStock];
        }
    }

else {}块内的行newStock.conversionRate ...给出了一个Xcode预编译错误,声明“找不到__strong id类型对象的属性” - 我猜是因为它无法判断newStock是否真的会我刚宣布的是什么?但是main.m末尾的assign语句显示了相同的行错误,就像newStock没有这些属性一样,即使BOTH类可以访问它们。

如何让newStock明白它肯定会是一个具有这些属性的类,但也可能具有与子类关联的转换率?

我试过了:

        BNRStockHolding newStock;  <-- starting with superclass

        // Coin flip to determine type
        NSUInteger randomType = random() % 2;
        if (randomType == 0) {

           newStock = [[BNRStockHolding alloc] init];

        } else {

            newStock = [[BNRForeignStockHolding alloc] init];
            newStock.conversionRate = globalConRate;
        }

这将使底线上的错误消失,但仍然无法在else {}块中的子类方法中进行编译。

我哪里出错了?

1 个答案:

答案 0 :(得分:2)

(我假设这实际上是main.m,而不是main.c。)

您的主要错误是使用id而不是类型。

 id newStock;

这说明newStock是某种对象,我不知道是什么。&#34;在ObjC中,id可以发送任何消息,但它没有任何属性。所以你不能在它上面使用点符号。有很多方法(不要使用点符号),但更好的解决方案是使用类型:

BNRStockHolding *newStock = nil;

这会导致问题:

newStock = [[BNRForeignStockHolding alloc] init];
newStock.conversionRate = globalConRate;

您可以通过这种方式修复:

BNRForeignStockHolding *foreignStock = [[BNRForeignStockHolding alloc] init];
foreignStock.conversionRate = globalConRate;
newStock = foreignStock;

但是,如果唯一的东西是外国股票&#34;外国&#34;是它有转换率,我强烈建议不要在这里进行子类化。只是让所有股票都有转换率。如果是国内的,请将转换率设为1。