gpt4 book ai didi

ios - Objective-c:编写私有(private)方法,被覆盖的可能性很小

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:43 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

7年前关闭。




Improve this question




假设我有一个 UIView 子类,我经常遵循这种模式

@implementation Unicorn

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
[self setup];
}
return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if(self)
{
[self setup];
}
return self;
}

- (void)setup
{
// Important initial setup
// This view will fall down and break hard on you if this code never runs
//
// This is just an example of a *private* method though the
// nature of this specific method implies *protected*
// (nonetheless: for sake of discussion regard it as a private method)
}

@end

另一个开发人员来了,想要子类化 Unicorn和他的新类(class) LaserUnicorn .这种方法很可能也很有可能 -setup -method 将被覆盖。

这可能有多种原因
  • 巧合的是 subclass-dev 遵循相同的模式并且不检查基类
  • 基类稍后重构/更改(在子类化之后)并且基类开发人员无权检查所有子类
  • 基类实现在库/框架/api 中(子类开发者不了解类的实现)

  • 问:这不能通过在每个私有(private)方法前加上 _ 来解决吗?下划线?
    答:如果这是自定义,它很可能是 LaserUnicorn 的自定义以及。

    问:好的,重命名 -[Unicorn setup] 怎么样?方法 -[Unicorn setupUnicorn]然后LaserUnicorn级是否命名它无关紧要 -[LaserUnicorn setup]-[LaserUnicorn setupLaserUnicorn] ?
    答:好的,那么所有其他私有(private)方法呢?我们真的应该仅仅因为它是私有(private)的就用类名作为后缀吗?请记住,大多数方法是或实际上应该是私有(private)的,以便标题具有干净、小巧且易于理解的界面。

    问:但这真的是个问题吗?我明白你的理论,但是这什么时候发生?
    答:对我来说,这是不确定性潜入我的日常斗争之一。我不喜欢不确定性。至少在它影响我如何命名方法时不会,以防有人子类化我的类。

    问:我出来说话了。我们可以做些什么吗?
    答:是个冷世界的兄弟。当涉及到类别时,这是一个更大的问题。在那里我们必须为所有内容添加后缀。至少随着越来越多地创建和使用越来越多的不同 pod 和库的转变。

    所以我正在寻找的是解决这个日常问题的好方法。 Apple 对这个主题有什么建议吗?

    最佳答案

    基于@nhgrif 的评论。

    NS_REQUIRES_SUPER 在接口(interface)中写出每个 protected 方法.例如。:

    @interface Unicorn (SubclassEyesOnly)

    - (void)setup NS_REQUIRES_SUPER;

    @end

    关于ios - Objective-c:编写私有(private)方法,被覆盖的可能性很小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21798249/

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