加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Objective-C中的覆盖方法

发布时间:2020-12-16 09:36:24 所属栏目:百科 来源:网络整理
导读:我对Objective-C比较陌生,我一直在思考所有方法实际上都是虚拟的.我创建了这个小控制台程序: #import Foundation/Foundation.h@interface BaseClass : NSObject{}- (void) virtualMethod: (NSInteger) integer;@end@interface DerivedClass : BaseClass{}-
我对Objective-C比较陌生,我一直在思考所有方法实际上都是虚拟的.我创建了这个小控制台程序:

#import <Foundation/Foundation.h>

@interface BaseClass : NSObject
{
}
- (void) virtualMethod: (NSInteger) integer;
@end

@interface DerivedClass : BaseClass
{
}
- (void) virtualMethod: (NSString *) string;
@end

@implementation BaseClass

- (void) virtualMethod: (NSInteger) integer
{
    NSLog(@"%ld",integer);
}
@end

@implementation DerivedClass

- (void) virtualMethod: (NSString *)string
{
    NSLog(@"%@",string); // Program received signal: "EXC_BAD_ACCESS". -- as expected
}
@end

int main (int argc,const char * argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSArray *arr = [NSArray arrayWithObjects: [BaseClass new],[DerivedClass new],nil];
    for (int i = 0; i < arr.count; i++) 
    {
        BaseClass *b = (BaseClass *)[arr objectAtIndex: i];
        [b virtualMethod: i];
    }
    NSLog(@"nnTapos na!nn");

    [pool drain];
    return 0;
}

正如所料,我在派生的virtualMethod:中得到了一个EXC_BAD_ACCESS,因为毕竟它不需要一个整数,它需要一个NSString *作为参数.虚拟机制基于选择器,并且似乎不考虑签名.

我的问题是:语言中是否有某些东西可以阻止这种覆盖与不同的签名发生?有些方法告诉编译器virtualMethod:应该始终具有相同的签名,或者如果签名不匹配,编译器会发出某种提示,警告或错误?

我知道一个好的程序员总是指出一个方法应该具有的类型的名称,但这是一个约定,而不是语言规则.我问的是编译器功能,以防止问题发生.

解决方法

好吧,有…但你可能不想使用它.在Xcode中有一个名为“Strict Selector Matching”的构建设置(它作为-Wstrict-selector-match传递给编译器).如果编译器找到两个具有不同参数或返回类型的选择器,这将警告您.

不幸的是,即使类型不同但兼容,警告也会出现.因此,如果你打开它,你会得到一堆虚假警告的地方,你不会期望是模棱两可的.不过,请随意尝试一下.

如果你想更多地了解它,Matt Gallagher写了a nice post about it.与此同时,我担心这里没有一个很好的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读