【问题标题】:Overriding in subclass after checking a boolean检查布尔值后在子类中覆盖
【发布时间】:2012-02-17 15:54:49
【问题描述】:

如果布尔值设置为某个值,我打算覆盖子类中的一个方法,然后切换这个值,并想到了两个选项:

1.调用 super 并检查成功

// Superclass
-(BOOL) showEngine
    BOOL result = !self.isEngineActive;
    if (result) {
        // Does something common to both super and subclass
        self.isEngineActive = YES;
    }
    return result;
}

// Subclass override
-(BOOL) showEngine
    BOOL result = [super showEngine];
    if (result) {
        // Does something unique to subclass
    }
    return result;
}

2。委托给第二种方法

// Superclass
-(void) showEngine
    if (!self.isEngineActive) {
        // Delegate
        showEngineNow();
        // Does something common to both super and subclass
        self.isEngineActive = YES;
    }
}

// Subclass override
-(void) showEngineNow() {
    [super showEngineNow];
    // Does something unique to subclass
}

第一个方法具有必须调用 super 并检查结果的负面影响,而第二个方法具有对委托的第二个方法调用的负面影响。哪种方法更好,有没有我没有想到的方法?

【问题讨论】:

    标签: objective-c overriding boolean superclass


    【解决方案1】:

    不得不调用 super 的负面影响

    在重写方法时调用超级实现是很常见的。我不认为这是负面的。从问题中不清楚您要达到什么目标,但我会选择选项 1 - 为什么要引入更多复杂性?

    这是假设你在超级实现中所做的未指定的//stuff也应该由子类完成。如果没有,您将需要拆分为单独的方法。

    我不认为您在使用 Cocoa 中的“委托”。如果它只是同一类中的另一个方法,则它不是委托。委托是符合已知协议的单独对象。

    如果你觉得方法变得太长并且做了太多的事情,那么一定要把它们分解并只覆盖你子类中的相关部分。在这种情况下,选项 2 是您最好的选择,但不要称其为代表。

    【讨论】:

    • 我应该更清楚,都调用super,我的意思是首先必须调用super并检查结果,存储并返回它。它比第二种方法有更多的依赖关系,它解耦了 showEngine 中的切换逻辑,让你在委托中做任何需要的事情。我已经更新了我的问题以反映您的观点。
    • 再次,我应该说 showEngine 将分配给 showEngineNow 的任务委托给了。我不是故意混淆 :) 我确定这个方法有一个正确的名称。
    • 我很容易糊涂,别担心!
    • 我决定用数字 1,可能会长一点,但是返回 BOOL 会提示你使用 super,它不会公开 showEngineNow(是的,我可以使用私有类别,但这会使它更长),您还可以检查调用者是否成功。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 2015-11-10
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2017-01-22
    相关资源
    最近更新 更多