我有很多子实体,它们从同一个BaseEntity继承属性。
我想编写一个接受任何子节点并设置基本属性的泛型方法。
ChildDto *child = [[ChildDto alloc] init];
child = [BaseEntityDto SetBaseProperties:child fromDictionary:src];
上面给出了'不兼容的指针类型'错误。
当我尝试将生成的BaseEntity转换为其中一个子类时,转换失败并且对象仍为BaseEntity类型。
child = (ChildDto*)[BaseEntityDto SetBaseProperties:child fromDictionary:src];
由于使用指针,显然在Objective C中进行强制转换是一个坏主意,似乎没有“动态”类型可以设置为返回类型。
那么解决这个问题的正确方法是什么?
答案 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;
这是一种正确的做法吗?