我来自Java,我正在重新审视Head First Design Patterns一书(根据一些开发人员的说法,它是设计模式的圣经)。我试图通过将Java翻译成obj-c来重新创建Duck Simulator,这就是我到目前为止所做的:
https://github.com/ZnelArts/IOSDesignPatterns/tree/master/DesignPatterns/Strategy/DuckSimulator
此模拟器使用使用协议应用的策略模式。我的实施有两个问题:
1-我不能像在Java版本中那样抽象Duck类,在Java版本上,方法“display()”是抽象的,应该由子类实现。
2-我必须公开Duck类属性,以便子类可以访问它们,这与Java中的子类可以看到私有属性的情况不同。
这个解决方案的理想设计是什么?
答案 0 :(得分:1)
你走在正确的道路上,你已经很好地确定了练习中Objective-C语言的局限性。
Objective-C缺乏以下工具:
<强> 1。有抽象方法
抽象方法限制有一种解决方法;您可以为抽象方法实现调用[doesNotRecognizeSelector:]
。
以下是类层次结构的示例,其中基类是抽象的。有关更多详细信息,您还可以查看此thread(在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
<强> 2。拥有受保护的成员和方法
在Stackoverflow上已经有一个很好的thread,你可以检查一下。