0

基本的に、BaseObject という基本クラスがあります。RedObject、BlueObject と呼ばれる 2 番目のタイプのクラス。BaseObject クラスのサブクラスです。

したがって、RedObject.h には次のように記述されています。

#import "BaseObject.h"

@interface RedObject : BaseObject

BlueObject.h には、次のように記述されています。

#import "BaseObject.h"

@interface BlueObject : BaseObject

MyObject という 3 番目のタイプのクラスもあります。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: RedObjectを返す互換性のないポインター型 '結果の型が 'MyObject*' の関数から'

警告メッセージ 2:結果型が 'MyObject*' の関数からBlueObject _strong' を返す互換性のないポインター型

呼び出し元クラスから MyObject のインスタンスをインスタンス化しようとすると、正常に動作します。RedObject/BlueObject および BaseObject のすべてのプロパティにアクセスしたことを確認できます。しかし、黄色の警告を修正する方法がわかりません。または、何かを逃した場合は?

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

2 に答える 2

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 に答える
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 に答える