objective c方法返回动态类型

时间:2014-11-15 10:53:54

标签: objective-c

我有很多子实体,它们从同一个BaseEntity继承属性。

我想编写一个接受任何子节点并设置基本属性的泛型方法。

ChildDto *child = [[ChildDto alloc] init];
child = [BaseEntityDto SetBaseProperties:child fromDictionary:src];

上面给出了'不兼容的指针类型'错误。

当我尝试将生成的BaseEntity转换为其中一个子类时,转换失败并且对象仍为BaseEntity类型。

child = (ChildDto*)[BaseEntityDto SetBaseProperties:child fromDictionary:src];

由于使用指针,显然在Objective C中进行强制转换是一个坏主意,似乎没有“动态”类型可以设置为返回类型。

那么解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

如果您没有理由不这样做,则应使用普通继承来创建对象

@interface BaseEntity : NSObject
-(instancetype)initWithProperties:(NSDictionary *) properties;
@end


@implementation BaseEntity

-(instancetype)initWithProperties:(NSDictionary *) properties
{
    self = [super init];
    if (self){
         // apply properties for base
    }
    return self;
}

@end

@interface ChildDTO : BaseEntity
@end


@implementation ChildDTO

-(instancetype)initWithProperties:(NSDictionary *) properties
{
    self = [super initWithProperties:properties];
    if (self){
         // apply properties for child
    }
    return self;
}

@end

答案 1 :(得分:0)

Objective-C非常有活力。您的问题可能来自缺乏经验。我建议您熟悉键值编码指南:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html。它很有可能为您的问题提供答案。

答案 2 :(得分:0)

我发现如果我将BaseEntity的子项传递给SetBaseProperties,设置道具并不返回任何内容,它可以正常工作。

ChildDto *child = [[ChildDto alloc] init];
[BaseEntityDto SetBaseProperties:child fromDictionary:src];
// base properties of child are now set

所以SetBaseProperties的签名是:

+(void)SetBaseProperties:(BaseEntityDto *)object fromDictionary:(NSDictionary*)dictionary;

这是一种正确的做法吗?