• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 创建更好的面向对象设计

[复制链接]
菜鸟教程小白 发表于 2022-12-13 04:45:21 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有以下类(class):

Teacher
Student
Class (like a school class)

它们都是从具有以下代码的 KObject 扩展而来的:

- initWithKey
- send
- processKey

Teacher、Student Class 都使用 KObject 父类的函数 processKey 和 initWithKey。他们实现了自己的发送版本。我遇到的问题是永远不应该实例化 KObject 。它更像是一个抽象类,但是objective-c中没有抽象类的概念。它只对允许子类访问一个属性和两个函数有用。

我该怎么做才能使 KObject 无法实例化但仍允许子类访问 KObject 的函数和属性?



Best Answer-推荐答案


抽象类在 Objective-C 中很常见, class cluster - Cocoa 中广泛使用的模式 - 是抽象工厂模式的变体。

但是,正如您所指出的,没有语言工具可以将方法或类明确划分为抽象 - 这通常在文档中完成。如果您需要额外的安全措施以确保不会以意外方式使用该类,您可以执行以下操作:

初始化器:

//Invocation of the initializer in a sub-class will not raise the exception. 
if ([self class] == [MyAbstractClass class]) 
{
   [NSException raise: . . . class is abstract - use subclass. 
}

方法:

- (BOOL)someAbstractMethod
{
    [NSException raise:NSInvalidArgumentException format"%@ is abstract", 
        NSStringFromSelector(_cmd)];
    return NO;
}

协议(protocol)与抽象库

我不同意其他一些答案中提出的“最好使用协议(protocol)”的说法。虽然可以将抽象基类与协议(protocol)结合起来,但不一定更好。

何时使用协议(protocol)

使用协议(protocol)来指定集成合约——比如插件架构。一个例子是“媒体播放器”,其中为电影音频实现“播放” > 流将完全不同。

何时使用抽象基类(或类簇)

当类层次结构之间的某些行为是共享的,并且某些实现细节在特定子类型之间有所不同时,请使用抽象基类。 .在这里使用协议(protocol)不一定更好,除非您希望传达这组方法可交换为另一个实现的意图。

类集群:

使用类集群,工厂方法获取子类型之一的实例位于基类本身上。有时这会产生可读性和内聚性很好的代码。 (可能与您的具体示例无关,但与 Objective-C 中的抽象类有关)

关于ios - 创建更好的面向对象设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472668/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap