1

OKこのテーマはSOで何度も言及されていることは知っていますが、そのような質問をいくつか確認した後、サブクラスの基本クラスのゲッター/セッターをオーバーライドすることに関して私が抱えている問題については誰も話していません。

私の基本クラスは次のとおりです。

#import <Foundation/Foundation.h>
@interface BaseClass : NSObject
@property (nonatomic, assign) int value;
@end

@implementation BaseClass
@synthesize value;
@end

それから、サブクラスをシムとして機能させ、「値」をintから子クラスの列挙型にマップします。

#import <UIKit/UIKit.h>
#import "BaseClass.h"

typedef enum {
    zero = 0,
    one,
    two,
    three,
    four
} NumberEnum;

@interface ChildClass : BaseClass
-(void)setValue:(NumberEnum)newValue;
-(NumberEnum)value;
@end

@implementation ChildClass

-(void)setValue:(NumberEnum)newValue
{
    [super setValue:(int)newValue];
    NSLog(@"Child Setter");
}

-(NumberEnum)value
{
    NSLog(@"Child Getter");
    return (NumberEnum)[super value];
}

@end

そして、私はこのコードを使用してテストします:

ChildClass* fred = [[ChildClass alloc] init];
NumberEnum barney;
fred.value = one;
barney = fred.value;
barney = [fred value];

XCode(4.5.2)は警告を生成します

プロパティのタイプ'value'がアクセサのタイプ'value'と一致しません

この行のみ

barney = fred.value;

コードを実行すると、チャイルドセッターとゲッターの両方のログメッセージが表示されます。では、この警告を排除するにはどうすればよいのでしょうか。そもそもなぜ警告が表示されるのでしょうか。

4

2 に答える 2

1

あなたの@property言うintこととコンパイラはおそらくあなたのメソッドを台無しにしています。@propertyタイプをに設定してみてくださいNumberEnum。機能するはずです(列挙型定義を.hに移動する必要があります)

于 2012-11-23T14:06:31.070 に答える
0

問題のある行:

barney = fred.value;

プロパティを使用することをコンパイラに通知しますvalue。あなたの子クラスはそれを定義しないので、それは基本クラスに行きます。value警告の原因となる別のタイプで見つかりました。

解決策は、プロパティを次のように記述することです。

@property (nonatomic, assign) int value;

および列挙型:

enum {
    zero = 0,
    one,
    two,
    three,
    four
};
typedef int NumberEnum;

このようにして、合成されたプロパティメソッドと独自の実装が同じデータ型で機能します。シンボリック値を使用でき、警告はありません。

NSUInteger64ビット対応なので、代わりに使用することをお勧めします。

NumberEnumそしてもちろん、基本クラスのようにプロパティを定義するだけの場合は、はるかに優れています。

于 2012-11-25T15:55:32.990 に答える