gpt4 book ai didi

Objective-C - 模板方法模式?

转载 作者:太空狗 更新时间:2023-10-30 03:34:28 25 4
gpt4 key购买 nike

所以我一直在阅读关于 Objective-C 的模板方法,我试图了解它们的特别之处。根据我的理解,基类中的任何方法都可以被覆盖并且可以调用 super 吗?那么模板方法除了覆盖基类中的方法之外还有什么吗?

如果我错了,你能解释一下什么是模板方法模式吗?你能举个例子吗?

最佳答案

是的,模板模式不仅仅是覆盖基类中的方法。

当算法的轮廓被具体定义时,可以使用模板模式,但是算法的步骤是抽象的。这意味着可以以不同的方式实现这些步骤。但是,算法的总体轮廓预计不会改变。

我刚刚创建的示例:

class Life {

public method goThroughTheDay(){
goToWork();
eatLunch();
comeBackHome();
programABitMore();
}
abstract method goToWork();
abstract method eatLunch();
abstract method comeBackHome();
abstract method programABitMore();
}

class GoodLife extends Life {
//override all the abstract methods here
}

//The client application
Life life = new GoodLife();
life.goThroughTheDay();

基本上,一天的预计结束方式在 Life 类中具体定义。但是,过程的细节由子类(即 GoodLife)处理。 GoodLife 类将执行与可能的 ToughLife 类非常不同的步骤。

此模式有一些变体;例如一些步骤也可以具体定义。在例子中,eatLunch()可以具体定义在Life类中;这意味着子类不会改变这种行为。

如果您有一个可以用不同方式实现的相对复杂的算法,那么该模式就很有意义。

======================================

我在回答中不知何故错过了 Objective-C 的部分。这是它在 Objective-C 中的样子:

@interface Life : NSObject

- (void) goThroughTheDay;

- (void) goToWork; // Abstract
- (void) eatLunch; // Abstract
- (void) comeBackHome; // Abstract
- (void) programABitMore; // Abstract

@end

@implementation Life

- (void) goThroughTheDay {

[self goToWork];
[self eatLunch];
[self comeBackHome];
[self programABitMore];
}

- (void) goToWork { [self doesNotRecognizeSelector:_cmd]; }
- (void) eatLunch { [self doesNotRecognizeSelector:_cmd]; }
- (void) comeBackHome { [self doesNotRecognizeSelector:_cmd]; }
- (void) programABitMore { [self doesNotRecognizeSelector:_cmd]; }

@end

@interface GoodLife : Life

@end

@implementation GoodLife

- (void) goToWork { NSLog(@"Good Work"); }
- (void) eatLunch { NSLog(@"Good Lunch"); }
- (void) comeBackHome { NSLog(@"Good Comeback"); }
- (void) programABitMore { NSLog(@"Good Programming"); }

@end

Objective-C 没有对抽象类的内置支持,因此我使用 doesNotRecognizeSelector: 方法解决了这个问题。可以找到有关抽象类和 Objective-C 的更多详细信息 here .

关于Objective-C - 模板方法模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com