【问题标题】:Correct Concept for Object-Oriented Programming面向对象编程的正确概念
【发布时间】:2013-08-15 22:44:54
【问题描述】:

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

@interface SuperClass : UIViewController
- (void)methodOne;

// Other public stuff


@end

.......

@implementation SuperClass

- (void)methodOne
{
    //some implementation
}

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

@end

如果我正在实现它的子类:

@interface SubClass : SuperClass

@end

.......

@implementation SubClass

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

@end

那么从上面的例子来看,如果我创建一个视图控制器,它是一个 SubClass 的类,它本质上是否会创建一个 SubClass 对象并自动添加所有 SuperClass 方法的实现?我的想法是,如果预处理器运行时,它是否采用任何未在子类中被覆盖的方法,而只是将超类代码方法放入该类以供使用?在这种情况下,我只覆盖了超类中的“methodOne”方法,而单独留下了“objectMethod”方法。这是否意味着我的子类将利用新的重写的“methodOne”实现并使用超类的“objectMethod”实现?

非常感谢!如果我需要澄清一些事情,请告诉我。

【问题讨论】:

    标签: ios objective-c class polymorphism


    【解决方案1】:

    如果您在 SubClass 实现中重新定义 methodOne,则 SubClass 的实例将使用重新定义的实现。如果没有重新定义 SubClass 的实现,它将寻找 SuperClass 的实现来进行定义。这个过程递归地继续通过更高的超类,直到找到一个定义。

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

    -(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
        ...
    }
    

    【讨论】:

    • 非常感谢!这对我来说真的很清楚。我还在下面对相关问题发表了评论。如果您对此有任何其他见解,我也将不胜感激!再次感谢!
    【解决方案2】:

    是的。子类获取所有超类方法。如果您覆盖一个,则该方法不再具有它的超类实现。所以在这种情况下,当你实例化一个子类实例并调用任一方法时,你会得到超类的objectMethod和子类的methodOne。

    【讨论】:

    • 太棒了!我很高兴看到我的理解是正确的。我遇到困难的另一件事是在我的子类中使用我的超类中的变量。在我的具体示例中,我正在创建一个游戏,并且 SuperClass 是游戏,并且是游戏被实例化为属性的地方。我的子类需要覆盖使用相同属性对象的方法,但显然我无权访问它。我也不能公开这个属性。如何提供需要访问另一个类属性的覆盖?我也不能使用委托。
    • 我认为这个问题有两种解决方案:1)将属性公开。但是既然你说你不能那样做...... 2)在超类中创建某种方法,子类可以使用 self 调用它将从私有属性中获取你需要的相关数据......所以假设你有 int x 和 int y 并且您不想公开它们,但是您需要 x+y,编写一个公共方法 -(NSInteger)xplusy 进行计算并返回它,并且应该可以在子类中使用...或者你知道 -(NSInteger)x 如果你只是想要 x。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2013-02-18
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多