Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 面向对象编程的正确概念_Ios_Objective C_Class_Polymorphism - Fatal编程技术网

Ios 面向对象编程的正确概念

Ios 面向对象编程的正确概念,ios,objective-c,class,polymorphism,Ios,Objective C,Class,Polymorphism,我问这个问题是想看看我对面向对象工作原理的理解是否正确。假设我有一个抽象的超类,它有几个方法,都有某种实现 @interface SuperClass : UIViewController - (void)methodOne; // Other public stuff @end @implementation SuperClass - (void)methodOne { //some implementation } - (someObject *)objectMetho

我问这个问题是想看看我对面向对象工作原理的理解是否正确。假设我有一个抽象的超类,它有几个方法,都有某种实现

@interface SuperClass : UIViewController
- (void)methodOne;

// Other public stuff


@end

@implementation SuperClass

- (void)methodOne
{
    //some implementation
}

- (someObject *)objectMethod
{
     //more implementation
}

@end
@implementation SubClass

- (void)methodOne
{
    // override method implementation code
}

@end
然后,如果我正在实现它的一个子类:

@interface SubClass : SuperClass

@end

@implementation SuperClass

- (void)methodOne
{
    //some implementation
}

- (someObject *)objectMethod
{
     //more implementation
}

@end
@implementation SubClass

- (void)methodOne
{
    // override method implementation code
}

@end
因此,从上面的例子来看,如果我创建一个视图控制器,它是一个子类的类,它本质上会创建一个子类对象并自动添加所有超类方法的实现吗?我想说的是,当预处理器运行时,它是否接受子类中未被重写的任何方法,并将超类代码方法放入该类中以供使用?在本例中,我只从超类中重写了“methodOne”方法,而不使用“objectMethod”方法。这是否意味着我的子类将使用新的重写“methodOne”实现,并使用超类“objectMethod”实现


非常感谢!如果我需要澄清什么,请告诉我。

是的。子类获取所有的超类方法。如果重写一个,那么该方法不再具有它的超类实现。因此,在本例中,当实例化子类实例并调用任一方法时,您将获得超类的objectMethod和子类的methodOne。

是。子类获取所有的超类方法。如果重写一个,那么该方法不再具有它的超类实现。因此,在本例中,当实例化子类实例并调用任一方法时,您将获得超类的objectMethod和子类的methodOne。

如果在子类实现中重新定义
methodOne
,子类的实例将使用重新定义的实现。如果子类实现没有重新定义,它将从超类的实现中寻找定义。这个过程递归地在更高的超类中继续,直到找到定义为止

如果您想稍微修改子类中的定义,可以执行以下操作:

-(void) methodOne{
    // Some code to add before SuperClass's implementation is called
    ....

    // Call SuperClass's implementation
    [super methodOne];

    // Some code to add after SuperClass's implementation is called
    ...
}

如果在子类实现中重新定义
methodOne
,子类的实例将使用重新定义的实现。如果子类实现没有重新定义,它将从超类的实现中寻找定义。这个过程递归地在更高的超类中继续,直到找到定义为止

如果您想稍微修改子类中的定义,可以执行以下操作:

-(void) methodOne{
    // Some code to add before SuperClass's implementation is called
    ....

    // Call SuperClass's implementation
    [super methodOne];

    // Some code to add after SuperClass's implementation is called
    ...
}

令人惊叹的!我很高兴看到我的理解是正确的。另一件我很难处理的事情是在我的子类中使用超类中的变量。在我的具体示例中,我正在创建一个游戏,超类就是游戏,是游戏被实例化为属性的地方。我的子类需要重写使用相同属性对象的方法,但显然我无权访问它。我也不能公开这个财产。如何提供需要访问其他类属性的重写?我也不能用授权。我认为解决这个问题有两个办法:1)公开财产。但既然你说你不能这么做。。。2) 在超类中创建某种方法,子类可以使用self调用该方法,从而从私有属性中获取所需的相关数据。。。假设你有int x和int y,你不想公开它们,但你需要x+y,写一个公共方法-(NSInteger)xplusy来进行计算并返回它,它应该可以在子类中使用。。。或者你知道-(NSInteger)x如果你只是想要x,太棒了!我很高兴看到我的理解是正确的。另一件我很难处理的事情是在我的子类中使用超类中的变量。在我的具体示例中,我正在创建一个游戏,超类就是游戏,是游戏被实例化为属性的地方。我的子类需要重写使用相同属性对象的方法,但显然我无权访问它。我也不能公开这个财产。如何提供需要访问其他类属性的重写?我也不能用授权。我认为解决这个问题有两个办法:1)公开财产。但既然你说你不能这么做。。。2) 在超类中创建某种方法,子类可以使用self调用该方法,从而从私有属性中获取所需的相关数据。。。假设你有int x和int y,你不想公开它们,但你需要x+y,写一个公共方法-(NSInteger)xplusy来进行计算并返回它,它应该可以在子类中使用。。。或者你知道-(NSInteger)x如果你只是想要x。非常感谢!这对我来说真的是件好事。我也在下面对一个相关问题发表了评论。如果您对此有任何其他见解,我也将非常感谢!再次感谢!非常感谢你!这对我来说真的是件好事。我也在下面对一个相关问题发表了评论。如果您对此有任何其他见解,我也将非常感谢!再次感谢!