gpt4 book ai didi

iphone - objective-c 中的子类化和继承

转载 作者:可可西里 更新时间:2023-11-01 06:22:20 27 4
gpt4 key购买 nike

我有一个名为 AbstractBook 的类,它有一个属性:

@property(strong) AbstractPage *page;

现在假设我有一个名为 WhiteBookAbstractBook 子类和一个名为 WhitePageAbstractPage 子类。我希望 WhiteBook 类继承 page 对象,但是在这个类中,我希望它是特定的 WhitePage 类而不是 抽象页面

因此,在 WhiteBook 中,我只是将该属性重新声明为 WhitePage:

@property(strong) WhitePage *page;

但是,我收到一条警告:WhitePage 与继承自 AbstractBook 的 AbstractPage 不兼容。实现我的目标的正确方法是什么?

最佳答案

你想做的事情根本不可能。不要忘记这个:

@property(strong) AbstractPage *page;

声明一个 getter 和一个 setter

一般来说(这是针对一般的 OO 编程,而不仅仅是 Objective-C),覆盖 getter 返回父类(super class)实现的返回类型的子类没有问题,因为这不会破坏 API 契约。在你的例子中,一个 WhitePage 的实例也是一个 AbstractPage .

但是,setter 是不同的。您不能限制参数的类型,因为您的子类必须可用于任何 AbstractBook 的地方。被使用,所以在它认为是 AbstractBook 的东西上调用 setter 的代码有权传递任何的实例AbstractPage子类,因为 API 就是这么说的。

我想我会做的是向 AbstractBook 添加一个方法叫做类似

-(bool) isLegalPage: (AbstractPage) aPage;

在基类中始终返回 true 但仅对 WhiteBook 中的白页返回 true .然后我会手动实现 setter 如下:

-(void) setPage: (AbstractPage*) aPage
{
if (![self isLegalPage: aPage])
{
// throw an exception or do other error notification
}
else
{
Do the assignment according to reference count/ARC/GC model
}
}

如果页面不合法,setter 将抛出异常的文档,人们应该使用 isLegalPage:方法来测试这个。

替代 id 具有只读属性并在基类和子类中使用不同的 setter,或者在基类中根本没有 setter。

关于iphone - objective-c 中的子类化和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11614980/

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