1

我有以下格式的超类和子类:

 ParentClass.h 

 @interface ParentClass : NSObject

-(ParentClass *)field:(NSArray *)fields;
@end

ParentClass.m
#import "ParentClass.h"

@implementation ParentClass

-(id)init{
      self = [super init];
      if (self == nil) {
        return self;
       }  
      return self;
}


-(ParentClass *)field:(NSArray *)fields{
  ParentClass *pc = [[ParentClass alloc] init];
   // code      
   return pc;

 }

@end

Subclass.h

@interface Subclass : ParentClass

-(Subclass *)field:(NSArray *)fields;

 @end



Subclass.m
#import "Subclass.h"

@implementation Subclass

-(id)init{
   self = [super init];
   if (self == nil) {
     return self;
   }  
   return self;
 }


-(Subclass *)field:(NSArray *)fields{

// code      
    return (Subclass *)[self field:fields];

}
@end

我想问题就在这里。

return (子类 *)[self field:fields];

我没有以应有的方式访问父类方法。谁能告诉什么应该是正确的方法?

如果我这样打电话怎么办?

-(子类 *)subClassField:(NSArray *)fields{

return (Subclass *)[self field:fields];

}

我替换了 -(Subclass *)field:(NSArray *)fields;

带有 -(Subclass *)subClassField:(NSArray *)fields;

4

2 回答 2

2

首先请注意这段代码

-(ParentClass *)field:(NSArray *)fields{
    ParentClass *pc = [[ParentClass alloc] init];
    // code      
    return pc;    
 }

从软件设计的角度来看并不正确。从您发布的内容看来,ParentClass实例似乎可以从 field 方法创建并返回其自身类型的其他实例。这看起来不太好,但根据您的意图,它可能会很好。

如果有意义的话,可以考虑制作ParentClass不同的课程。FieldClass


关于子类,做你想做的事情是这样的:

-(ParentClass *)field:(NSArray *)fields
{
   // code      
   return [super field:fields];
}

请注意,我将返回的类型更改为(ParentClass *)和。您不能返回一个对象来代替一个对象(后者可能有前者不知道的额外数据)。做相反的事情是有效的(当有人希望收到一个类型的对象时,您可以返回一个对象)。selfsuperParentClassSubClassSubclassParentClass

于 2013-08-25T11:02:37.387 回答
1

话虽如此,您还不清楚您要达到的目标,但我会告诉您出了什么问题。首先将指针转换为基类指针是不够的,要调用超类方法,您应该这样调用它:

return (Subclass*) [super field:fields];  // Still wrong

但是你打破了多态性,正如方法签名所说,你正在返回一个Subclass对象,调用这个方法的用户期望有一个Subclass对象,但是在第一次调用刚刚由子类实现的方法时,它崩溃是因为您要返回超类的实例。也许你改变方法签名以返回一个指针就足够了ParentClass,但这会使方法无用,为什么要重写它?目前还不清楚您要做什么,以及您的逻辑路径是什么。

编辑

看过您在 Github 上发布的代码后,情况就大不相同了。在 Java 代码中,该方法field返回this,因此不会创建新对象,该方法仅用于副作用。该add方法不会破坏多态性,因为只是对象引用属于父类类型,但如果在子类上执行,它会返回对象本身 ( this),它属于子类类型。

对于这些情况,在 Objective-C 中使用了id类型,它用于表示指向任何类的任何对象指针。您也可以使用该ParentClass类型,但我会遵守约定。这是一个指示性代码:

@implementation ParentClass

@synthesize endpoint

- (id) add: (NSString*) endpoint fields: (NSArray*) fields
{
    <code>
    return self;  
}

- (id) field: (NSArray*) fields
{
    return [self add: self.endpoint fields: fields];  
}

@end

@implementation SubClass

- (id) field: (NSArray*) fields
{
    < Additional code >
    return [self add: self.endpoint fields: fields];
}


@end
于 2013-08-25T11:03:42.003 回答