0

基本上,我有一个名为 BaseObject 的基类。第二种类型的类称为 RedObject、BlueObject。它们是 BaseObject 类的子类。

因此,在 RedObject.h 中,它具有:

#import "BaseObject.h"

@interface RedObject : BaseObject

在 BlueObject.h 中,它具有:

#import "BaseObject.h"

@interface BlueObject : BaseObject

我还有第三种类型的类,称为 MyObject。在 MyObject.h 文件中,它具有:

#import "RedObject.h"
#import "BlueObject.h"

@interface MyObject : NSObject

-(id)init:(char)objectType;

在 MyObject.m 文件中,它具有:

-(id)init:(char)objectType
{
    self = [super init];
    switch (objectType) 
    {
        case 'R':
        {
            return [[RedObject alloc]init];  // this is where the yellow warning message 1
        }
        case 'B':
        {
            BlueObject *blueObject = [[BlueObject alloc]init];
            return blueObject;          // this is where the yellow warning message 2
        }
        default:
            break;
    }
    return self;
}

警告消息 1:不兼容的指针类型从结果类型为 'MyObject*' 的函数返回RedObject '

警告消息 2:不兼容的指针类型从结果类型为“MyObject*”的函数返回BlueObject _strong'

当我尝试从调用者类实例化 MyObject 的实例时,它工作正常。我可以验证我已经访问了 RedObject/BlueObject 和 BaseObject 的所有属性。但不确定如何解决黄色警告。或者如果我错过了什么?

MyObject *myObject = [[MyObject alloc]init:'R'];  // or 'B'
4

2 回答 2

0

从发布的评论,尤其是来自@kevboh 的评论中,我做了一些修改,如下所示,它似乎解决了我的问题。

在 MyObject.h 中:

//-(id)init:(char)objectType;  //removed

-(id)getObject:(char)objectType;  //added

在 MyObject.m 中:

//移除 -(id)init:(char)objectType 方法

// 添加了这个方法

-(id)getObject:(char)objectType
    {
        switch (objectType) 
        {
            case 'R':
            {
                return [[RedObject alloc]init]; //self;
            }
            case 'B':
            {
                BlueObject *object = [[BlueObject alloc]init];
                return object;
            }
            default:
                break;
        }
        return nil;
    } 

在调用者类中,使用这个:

MyObject *myObject = [[[MyObject alloc]init] getObject:'H'];
于 2012-05-16T18:51:09.930 回答
0

为什么不拥有一个完成所有构造的类方法。

+(id)newObject:(char)objectType
{
    switch (objectType) 
    {
        case 'R':
            return [[RedObject alloc]init]; //self;

        case 'B':
            BlueObject *object = [[BlueObject alloc]init];
            return object;

        default:
            return [[MyObject alloc]init];
    }
} 

这将按如下方式使用

MyObject *myObject = [MyObject newObject:'H'];
于 2012-05-16T21:05:13.423 回答