1

例如,假设我是子类化NSString。我的子类名为MyString,我想重写[NSString stringWithFormat:],但还要添加另一个参数,所以我的方法是[MyString stringWithParameter:format:]. 此方法将用于替换[NSString stringWithFormat:].

如果这是我的设置,用户仍然可以调用[MyString stringWithFormat:],然后调用[NSString stringWithFormat:]。有没有办法阻止用户打电话[MyString stringWithFormat:]?换句话说,有没有办法阻止对象的子类调用其父类的特定方法?

4

2 回答 2

1

正如其他人所暗示的那样,NSString是一个类簇,因此正确子类化可能非常棘手。但显然你的问题是关于子类化的更广泛概念,而不是关于处理类集群的额外复杂性,所以让我们把它放在一边。

stringWithFormat:与其考虑阻止调用者发送到 的实例,不如MyString考虑让您的MyString类覆盖stringWithFormat:以调用您的自定义stringWithParameter:format:方法并为参数提供默认值parameter

正如@Stephen Melvin 指出的那样,通常您的自定义方法会调用[super stringWithFormat:]以保留现有功能。

编辑

在对类集群进行子类化时,需要考虑以下几点:

您在类集群中创建的新类必须:

  • 成为集群抽象超类的子类
  • 声明自己的存储
  • 覆盖超类的所有初始化方法
  • 覆盖超类的原始方法(如下所述)

来源:https ://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/ClassClusters/ClassClusters.html

如果您觉得值得付出努力,Mike Ash 有一篇很棒的博客文章介绍了如何去做: http: //www.mikeash.com/pyblog/friday-qa-2010-03-12-subclassing-类-clusters.html

但是要问自己的第一个问题是:“我试图通过子类NSString化(或任何情况)解决什么问题,是否有更简单的方法来解决问题?”

于 2013-10-01T21:15:56.003 回答
1

使用编译器属性将方法标记为不可用。在你的头文件中:

 + (id)stringWithFormat:(NSString *)format, ... __attribute__((unavailable("Do not call +stringWithFormat")));

这将导致编译器错误并阻止使用该方法。

http://i.imgur.com/31h1AF4.png

在此处输入图像描述

于 2013-10-02T02:20:38.217 回答