gpt4 book ai didi

ios - Objective C 中的属性继承

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:06 26 4
gpt4 key购买 nike

我想继承我的基类属性和方法,这些属性和方法将由我的几个派生类使用。我希望这些属性和方法受到严格保护,以便它们只在派生类中可见,而不对任何外部类可见。但它总是给我一些错误。

@interface BasePerson : NSObject
@end

@interface BasePerson ()

@property (nonatomic, strong) NSMutableArray<Person*>* savedPersons;
@property (nonatomic) BOOL shouldSavePerson;

@end



@interface DerivedPerson1 : BasePerson

@end

@implementation DerivedPerson1

- (instancetype)init
{
if (self = [super init]) {
self.savedPersons = [NSMutableArray array];
self.shouldSavePerson = NO;
}

return self;
}

它总是给我一个错误

Property 'savedPersons' not found on object of type 'DerivedPerson1 *'
Property 'shouldSavePerson' not found on object of type 'DerivedPerson1 *'

我如何在 Objective C 中使用继承,我不希望 savedPersons 和 shouldSavePerson 属性对外部类可见。我只希望它们在我的基类和所有派生类中可见。

任何帮助都会很棒。谢谢

最佳答案

这不是 objectiveC 真正支持的东西。虽然有一些方法。让我们看看。

如果您将一个属性放在源文件类扩展中,那么它不会被公开,您也无法在子类中访问它。

一种方法是将所有子类放入与基类相同的源文件中。这根本不是一个好的解决方案,因为您确实希望为单独的类使用单独的文件。

SubClass 源文件中导入 BaseClass.m 似乎是合乎逻辑的,但这会产生链接器错误,指出您有重复的符号。

解决方案:

将扩展名分离到单独的 header 中。所以你有一个 MyClass

标题:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject

@end

来源:

#import "MyClass.h"
#import "MyClassProtected.h"

@implementation MyClass

- (void)foo {
self.someProperty = @"Some text from base class";
}

@end

然后您创建另一个头文件(仅头文件)MyClassProtected.h,其中包含以下内容:

#import "MyClass.h"

@interface MyClass ()

@property (nonatomic, strong) NSString *someProperty;

@end

和子类MyClassSubclass

标题:

#import "MyClass.h"

@interface MyClassSubclass : MyClass

@end

来源:

#import "MyClassSubclass.h"
#import "MyClassProtected.h"

@implementation MyClassSubclass

- (void)foo {
self.someProperty = @"We can set it here as well";
}

@end

所以现在如果用户 MyClassSubclass 将无法访问 protected 属性,而这正是您想要的。但缺点是用户仍然可以导入 MyClassProtected.h,之后他将有权访问该属性。

关于ios - Objective C 中的属性继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40652974/

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