目标C中的类继承和自定义^块执行

Posted

技术标签:

【中文标题】目标C中的类继承和自定义^块执行【英文标题】:Class inheritance and custom ^block execution in objective C 【发布时间】:2014-01-11 10:49:20 【问题描述】:

我有一个应用程序,在该应用程序中我调用了一个 Web 服务来检索具有给定 ID 的 JSON 对象。 无论我在哪个类,获取对象的方法在系统上都是相同的,但成功块会有所不同(id est,处理部分)——例如使用 AFNetworking。

我正在寻找仅实现一次 getter 部分但能够自定义处理的正确方法。

下面这段代码是个好方法吗:

   -(void)getObjectWithId:(NSString*)id_

    NSString *ns1 = [NSString stringWithFormat:@"%@%@%@",HOSTNAME,API_DETAIL,id_];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:ns1]];

    AFJSONRequestOperation *operation =[AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 


        //Here I want to do different processing task accordingly inheritance level // current class

        DLog(@"Response : %@ \n Request : %@",response,request);

        [self processObject:JSON];


     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) 

        //Do failure stuff

    ];

    [operation start];


然后:

-(void)processObject:(id)JSON


    //Customize according to current class


因此,所有子类都将继承自 getObjectWithId 并拥有自己的 processObject 实现

我还应该考虑什么?是正确的方法吗?

【问题讨论】:

【参考方案1】:

您的选择会起作用,但是将代码放在超类中会受到限制。如果限制适合您,请继续。

另一种方法是创建一个辅助方法或管理器类来托管getObjectWithId: 方法,但要提供 2 个参数,其中第二个参数是一个将 JSON 作为参数的块。这样,该方法包含所有可重用代码,并且该块允许与原始 AFNetworking API 相同的任意使用。

注意,“正确的方式”是适合您的情况的任何方式,也是可以理解和维护的......

【讨论】:

谢谢,在对我的代码进行高级审查后,我想我会在我的单例管理器中使用类(我认为)来包装一个 getter 方法,并将一个块作为参数传递接受 JSON。听起来不错!【参考方案2】:

无需使用子类化。代表会帮助你。

您可以创建一个实用程序类来检索 JSON 对象并为其声明协议。

@protocol WebServiceDelegate <NSObject>
- (void)didRetrivalJsonObject:(id)json ;
@end

你还需要修改方法

- (void)getObjectWithId:(NSString*)id_ delegate:(id<WebServiceDelegate>)delegate

    NSString *ns1 = [NSString stringWithFormat:@"%@%@%@",HOSTNAME,API_DETAIL,id_];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:ns1]];
    AFJSONRequestOperation *operation =[AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
        //Here I want to do different processing task accordingly inheritance level // current class
        DLog(@"Response : %@ \n Request : %@",response,request);
        [delegate processObject:JSON];
     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) 
        //Do failure stuff
    ];
    [operation start];

【讨论】:

我会考虑下面的方法,但是谢谢,这看起来也很酷

以上是关于目标C中的类继承和自定义^块执行的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# C#中的类继承

JAVA,为啥final类不能被继承,如果定义为final的类该类里面成员变量不特殊说明则是final类还是非final

c++继承

C++C++自学进阶:继承——入门

java中的继承定义。

java 静态main继承 的执行顺序