首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我在子类中重写了属性的setter,但是当我在超类的init方法中调用它时,为什么要在子类的方法响应中调用它呢?

在子类中重写属性的setter方法是为了在设置属性值时添加额外的逻辑或进行特定的处理。当在超类的init方法中调用该属性的setter方法时,是为了确保在初始化过程中也能够执行到子类中重写的setter方法。

在面向对象编程中,子类继承了超类的属性和方法,但是子类可能需要对继承的属性进行一些特定的处理。在初始化过程中,超类的init方法会被调用,而在init方法中,属性的setter方法通常会被调用来设置属性的初始值。如果子类重写了属性的setter方法,那么在超类的init方法中调用该属性的setter方法,就能够确保子类中重写的setter方法也会被执行。

这样做的好处是,可以保证在初始化过程中,无论是超类还是子类的特定逻辑都能够得到执行,确保属性的正确初始化。这种设计模式也符合面向对象编程的原则,即子类应该能够替代超类并且可以在不改变超类行为的情况下扩展或修改其功能。

举例来说,假设有一个超类Animal和一个子类Dog,其中Animal有一个属性name和一个setter方法setName。在Dog类中重写了setName方法,添加了一些特定的逻辑。当创建一个Dog对象时,会先调用Animal的init方法,而在init方法中会调用name的setter方法setName。如果在超类的init方法中不调用子类重写的setter方法,那么子类中添加的特定逻辑就无法执行,可能导致属性的初始化不完整或不正确。

总结来说,为了确保子类中重写的属性的setter方法能够在初始化过程中得到执行,需要在超类的init方法中调用该属性的setter方法。这样可以保证在子类中添加的特定逻辑或处理也能够得到执行,确保属性的正确初始化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS开发·KVO用法,原理与底层实现: runtime模拟实现KVO监听机制(Blcok及Delgate方式)

简单概述下 KVO 实现: 当你观察一个对象,一个新会动态被创建。这个继承自该对象原本,并重写了被观察属性 setter 方法。...自然,重写 setter 方法会负责调用原 setter方法之前和之后,通知所有观察对象值更改。...那么新setter方法又是什么?...你能通过它创建新子类,并添加新方法。 但这样一个子类有什么用?别忘了Objective-C一个关键点:object内部有一个叫做isa变量指向它class。...3、注册你创建这个,使其可用(使用objc_registerClassPair)。 为什么这里1和3都说到pair,我们知道pair中文意思是一对,这里也就是一对,那这一对是谁

2K30

为什么不能在init和dealloc函数中使用accessor方法

前言 为什么要在init和dealloc方法调用getter和setter: AppleMac与iOS关于内存管理开发文档,有一节题目为:“Don’tUse Accessor Methods...父有一个value属性子类自然也会集成该属性)。如果在父init(或其他初始化构造方法)中使用了valuesetter子类也重写了valuesetter,那么就会出现问题。...造成这个问题原因有两个:一就是init使用了setter;二是子类写了setter,导致init就会调用子类重写setter,万一重写setter中进行了一些子类特有的操作就可能会出现问题...案例二 如果在父init方法中使用了valuesetter,同时也写了setter。...为什么不能在dealloc调用accessor 还是基于子类写了value属性这一前提,子类对象销毁,首先调用子类dealloc,最后调用父dealloc(这与init初始化方法是相反

9.1K40

KVO详解(二)

新建子类时候,先申请开辟内存,然后注册,然后给添加class方法属性setter方法,也就是所谓重写class方法setter方法。...class方法复写还好说,就是让其返回其父也就是最开始那个原即可。 setter方法如何复写setter做了哪些事情?我们接下来就分析一下。...norman_setter: ? 上面提到,要在对应属性值改变时候,向所有监听该改变观察者们去发送消息,以通知其对该改变作出响应。 所以现在就有这样一个问题,如何找到这些观察者?...那我就会想到,既然这样,NSObject+NormanKVO复写dealloc方法好了: ? 这样做是有问题为什么?...不知道大家还有没有印象,在上篇文章在打印系统KVO产生中间方法列表时候,是有4个方法,如下: ? 其中一个方法就是dealloc,这说明中间子类dealloc也被覆写了

67531

2021年web前端面试集锦

(2)第二种方式是使用借用构造函数方式,这种方式是通过子类函数调用类型构造函数来实现,这一种方法解决了不能向类型传递参数缺点,但是它存在一个问题就是无法实现函数方法复用,并且类型原型定义方法子类型也没有办法访问到...这种方式解决了上面的两种模式单独使用时问题,但是由于我们是以类型实例来作为子类原型,所以调用了两次构造函数,造成了子类原型多了很多不必要属性。...nextTick方法会在队列中加入一个回函数,确保该函数在前面的dom操作完成后才调用; 比如,干什么时候就会使用nextTick,传一个回函数进去,在里面执行dom操作即可; 也有简单了解...这让明白了为什么可以nextTick中看到dom操作结果。...子类 子类原型为父实例 子类.prootype = new 父 修正子类原型为子类本身 子类.prototype.constructor=子类 new 子类即可调用父方法 构造函数继承 写个父

37330

【愚公系列】2021年12月 Python教学课程 22-面向对象编程-封装、继承、多态

当我们定义一个新时候,新称为子类(Subclass),而被继承称为基、父(Base class、Super class)。...2.1 单继承 我们来看一个例子: 总结: 虽然子类(Bosi)没有定义__init__方法但是(Cat)有,所以子类继承父时候这个方法就被继承了。...创建 Bosi 对象 bs ,就默认执行了父(Cat)__init__方法属性方法,会被继承给子类 另一个例子: 总结: 私有的属性,不能通过对象直接访问,但是可以通过方法来访问...实例: 总结: 所有父方法属性,都会被子类继承 再看一个例子: 2.3 重写父方法和调用父方法 所谓重写,就是子类,有一个和父相同名字方法子类方法会覆盖掉父同名方法...例如: 调用父方法 从上面的例子我们知道,子类如果有与父类同名成员,那就会覆盖掉父成员。那如果你想强制调用父成员?使用 super()函数!

20220

Python面向对象

property装饰器、slots魔法 我们可以使用property装饰器对属性进行封装、通过getter和setter方法进行属性访问和修改 Python是一门动态语言,可以程序运行时给对象绑定属性方法...但是,如果多个以不同方式实现了同一个方法(即有多个同名方法),必须在class语句中小心排列这些,因为位于前面的方法将覆盖位于后面的方法子类实例调用方法(或访问其属性,如果找不到该方法或者属性...,将在父查找 子类可以重写方法(包括构造函数),重写构造函数,要确保子类构造函数调用构造函数,否则可能无法正确初始化对象 Python中所有的方法实际上是virtual...使用鸭子类语言中,这样一个函数可以接受一个任意类型对象,并调用它走和叫方法。如果这些需要被调用方法不存在,那么将引发一个运行时错误。...方法不能使用或实例任何属性方法。实例和对象都可以调用静态方法。 ? ?

76110

Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承

但是组织代码,有限地使用这种技术可以节省大量时间。 继承是如何工作 要创建一个新子类,可以将现有父名称放在class语句括号。...但是请记住,继承主要目的是代码重用。如果您程序需要一个具有一组方法,这些方法是其他方法完全集,继承允许您避免复制和粘贴代码。 我们有时也称子类子类或派生,称父或基。...如果你在想,“为什么不能用一个函数或者全局变量来代替?”这暗示您可能不需要使用方法、类属性或静态方法。...这本中级水平书介绍它们唯一原因是,当你代码遇到它们,你可以认出它们,但是不鼓励你使用它们。...只要父方法名不同且不重叠,多重继承就很简单。这些种类被称为混合。(这只是对一统称;Python 没有mixin关键字。)但是当我们从多个共享方法复杂类继承时会发生什么

51920

Python 中使用私有成员子类

__value但是当我们想要子类化一个,并访问其私有成员,却没有一种简单方法。通常,我们希望直接操作原始数据对象,而无需总是使用访问器和修改器。...虽然这似乎违背了私有和公有的基本思想,但通常情况下,我们要子类是我们自己,我们很乐意将成员公之于子类,但不想让该类实例访问这些成员。那么,有没有一种干净方法来实现这种区别?...虽然私有属性Python并没有真正意义上私有属性但是通常情况下,其他开发者会遵守约定,不会随意访问或修改带下划线前缀变量,以此来保护私有属性。...这样,我们就既可以保护私有属性不被随意访问,又可以像访问普通属性一样使用它。...然后我们创建了一个子类 Child,它继承了 Parent Child ,我们定义了一个方法 access_private_value(),它可以访问和修改父私有属性 _value。

8310

iOS网络——NSURLSession详解及SDWebImage源码解析你要知道NSURLSession都在这里

,后面的回方法都不会再执行,第一次使用NSURLSession时候没有仔细查看官方文档导致后面几个回方法一直没有执行,所以实现一个回方法一定要弄懂每一个参数意义,就可以避免很多坑了。...,这个字典最多只有两个key-value键值对,数组可以有多个这样字典,每添加一个进度回块和下载完成回块就会把这个字典返回作为token,取消任务方法中就会从数组删除掉这个字典,但是只有当数组块字典全部被删除完了才会真正取消任务...其实这里并不懂为什么要加这个同步代码块 NSOperation子类加进NSOperationQueue后会自行调用start方法,并且只会执行一次,不太理解为什么需要加这个,懂读者希望不吝赐教...接下来一个比较重要方法就是接收到图片数据处理,接收到数据后就追加到可变数据,如果需要在图片没有下载完成就展示部分图片,需要进行一个解码操作然后调用回块将图片数据回传,接着就会调用存储进度回块来通知现在下载进度...以后,执行start方法就会通过一个可用NSURLSession对象来创建一个NSURLSessionDataTask下载任务,并设置回方法接收数据并进行一系列通知和触发回块。

2.8K100

9 Python 基础: 手把手带你梳理对象、继承与多态知识点

有些时候,你会看到以一个下划线开头实例变量名,比如_name,这样实例变量外部是可以访问但是,按照约定俗成规定,当你看到这样变量,意思就是,“虽然可以被访问,但是,请把视为私有变量,不要随意访问...继承与多态 OOP程序设计当我们定义一个class时候,可以从某个现有的class继承,新class称为子类(Subclass),而被继承class称为基、父(Base class...当子类和父都存在相同run()方法,我们说,子类run()覆盖了父run(),代码运行时候,总是会调用子类run()。这样,我们就获得了继承另一个好处:多态。...所以,继承关系,如果一个实例数据类型是某个子类,那它数据类型也可以被看做是父。...而当我们新增一种Animal子类,只要确保run()方法编写正确,不用管原来代码是如何调用

1K50

跟着来,你也可以手写VueRouter

可以看到上面代码我们调用了 ensureURL 方法来更新,而且是 this 调用,其实这个方法并不在父上,而在子类为什么将 ensureURL 方法写在子类?...因为初始化实例子类子类又继承父,可以理解为父方法以及属性都被子类继承了,transitionTo 方法当然也被继承了,那调用这个跳转方法,内部 this 指向就是子类,所以可直接调用子类方法...之前 VueRouter 实现,我们只是初始化了各个路由模块子类但是还没有开启路由监听,注意子类里启动监听方法是 setupListeners ,再次回到 src/hello-vue-router...OK,init 方法暂时写完了,我们要在什么时候调用它? 初始化方法调用 因为 init 方法还有启动监听,所以需要在一切都初始化好了再调用,并且这个时候还要能拿到 Vue 根实例。..._route = route }) } 可能有小伙伴会懵,其实也很好理解,就是 init 方法调用了 history 实例继承于父 listen 方法,传入一个更新 _route

1.5K40

Swift 构造器使用

构造器 init 好了然后, 谈一下在这两天写 Swift 遇到最大问题 —- 构造器 init 使用....只想安安静静地初始化 开始使用 init 当我遵从以前写 ObjC 习惯, Swift 中键入 init 之后, 编译器提醒: 复制代码 'required' initialize 'init...指定构造器是主要构造器, 要在指定构造器初始化所有的属性, 并且要在调用父合适指定构造器....不过为什么要遵循这三条规则? init 方法调用机制是什么? init 机制 Swift 中一个实例初始化是分为两个阶段 第一阶段是实例所有属性被初始化....init() 方法虽然被重载了, 但是并没有调用父指定构造器: 指定构造器必须调用它最近父指定构造器.

1.7K20

Objective-C继承和多态

OC可以@implementation定义哪些@interface无相应声明方法,但这个方法是私有的,仅在实现中使用。         ...+(void) load;  加载到运行环境时调用该方法                 测试:子类重写load方法来进行测试, 当重写完load方法mian方法不需要任何实例化任何对象                             ...子类具有父属性和 行为,以及自身属性和行为,也就是说“父更一般,子类更具体”。用一个富二代来说明一下继承。  ...2014-07-30 08:38:12.958 HelloOC[483:303] 是富二代BILL`s son,喜欢飙车 ​Objective-C多态     ​    ​多态简单说就是对于不同对象响应同一个方法做出不同反应...;     ​多态另一个例子: Animal是父子类有Cat 和 Dog,子分别重写了eat方法;实例化对象时候可以用下面的方法: 1 2 3 4 5 6 7 Animal *animal

1.2K80

KVO 正确使用姿势进阶及底层实现你要知道KVC、KVO、Delegate、Notification都在这里

首先,讲解一下为什么要在对象被销毁前删除监听器,我们开发中使用KVO很可能会遇到因为没有删除监听器而产生野指针错误。...context是一个id类型参数,注册监听器可以传入该参数,函数中会回传该参数,因此,该参数就能完美的解决上述两个问题。那context这个id类型参数设置为什么值比较合适?...,也就是所有注册了监听器都会执行回函数,但由于继承关系存在没有执行父函数而是执行了两次子类函数,因此,为了使得父也能够正确执行监听器函数,子类函数应当手动调用,所示子类监听器回函数正确写法应是如下代码...; 手动触发KVO 有时我们可能有一些需求,属性值满足要求下才去触发KVO,有的人可能会说直接在回函数中进行判断就好啦,但是当我们开发一些供他人使用框架我们不能保证其他用户能够按照要求进行条件判断...setter和getter方法,执行willChangeValueForKey:和didChangeValueForKey:方法和父setter方法,并通知所有监听对象,监听属性被修改了。

1.5K80

大厂前端面试考什么?

一个拥有 length 属性和若干索引属性对象就可以被称为数组对象,数组对象和数组类似,但是不能调用数组方法。...当然这是简单版响应式实现,如果需要实现一个 Vue 响应式,需要在 get 收集依赖, set 派发更新,之所以 Vue3.0 要使用 Proxy 替换原本 API 原因在于 Proxy 无需一层层递归为每个属性添加代理...(1)第一种是以原型链方式来实现继承,但是这种实现方式存在缺点是,包含有引用类型数据,会被所有的实例对象所共享,容易造成修改混乱。还有就是创建子类时候不能向类型传递参数。...(2)第二种方式是使用借用构造函数方式,这种方式是通过子类函数调用类型构造函数来实现,这一种方法解决了不能向类型传递参数缺点,但是它存在一个问题就是无法实现函数方法复用,并且类型原型定义方法子类型也没有办法访问到...这种方式解决了上面的两种模式单独使用时问题,但是由于我们是以类型实例来作为子类原型,所以调用了两次构造函数,造成了子类原型多了很多不必要属性

32770

Python第七章-面向对象高级

3.3.1最简单继承 3.3.2 继承__init__()调用规则 3.4方法重写(override) 3.4.1概念 3.4.2写父方法两种情况 3.4.3关于super...我们前面学习类属性和实例属性时候知道, 访问他们时候就可以直接获取到这些属性值. 而特性可以看成一种特殊属性, 为什么?...__init__(self, name) self.age = age # 子类写了方法 def speak(self): Father.speak...,子类对象调用方法,会调用哪一个父方法?...所以python 3.x定义都是新式 python 2.x定义,如果没有指定父,则不会以object作为父 新式和经典多继承,会影响到方法搜索顺序 提示:

35120

Kotlin:这是一份全面 & 详细 使用 语法学习指南

Javasetter方法 ---- 4....open class Food // Fruits继承Food class Fruits : Food() 对于子类重写父方法Kotlin方法也是默认不可重写子类要重写父方法...,则需方法前面加open关键字,然后子类重写方法前加override关键字 // 父 // & 方法前都加了关键字open,为了被继承 & 方法重写 open class Food...{ open fun banana() {} } // 子类 class Fruits : Food(){ // 重写了方法 override fun banana() {...---- 总结 本文全面介绍了Kotlin入门语法 接下来推出文章,将继续讲解Kotlin相关知识,包括使用、语法特点等,感兴趣读者可以继续关注博客哦:Carson_HoAndroid

89710

面试iOS 机会在自己手中

当我们滚动时候,也希望不调度,那就应该使用默认模式。但是,如果希望滚动,定时器也要回,那就应该使用common mode。 15. NStimer准吗?谈谈你看法?...扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型(使用范围只能在自身,而不是子类或其他地方),扩展声明方法没被实现,编译器会报警,这是因为扩展是在编译阶段被添加到...继承子类可以使用父方法和变量,当子类想对本类或者父变量进行初始化,那么需要重写init()方法 。父也可以访问子类方法和成员变量 21....,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以方法列表中找到对应方法实现. 4.当我们发送一个消息给一个NSObject对象,这条消息会在对象对象方法列表里查找...5.当我们发送一个消息给一个,这条消息会在Meta Class对象方法列表里查找 25. runtime ,SEL 和 IMP 区别 方法名 SEL – 表示该方法名称; IMP –

52951

Flutter 绘制探索 6 | 深入分析 CustomPaint 组件 | 七日打卡

= spread; } } 复制代码 ---- 二、探索监听 Listenable 1.CustomPainter 与 Listenable CustomPainter 是一个抽象,其持有一个...可以看到唯一设置方式就是过CustomPainter 构造函数。 这也是为什么子类只能在 super 设置原因。 ? ---- 2....如下图, CustomPaint child 是 一个图标,前景使用蓝圈,背景使用红圈,可以看到绘制三者层级关系。 ?...CustomPaint size 可能你使用 CustomPainter#paint 方法内回 size 对象,有些困惑,为什么有时候会是 Size(0,0),那么这里来一起探索一下回...---- 如下,画板回 paint 方法是,回是 size 对象,这个 size 是 RenderBox 成员。RenderCustomPaint 是 RenderBox 子类,故可用之。

1.3K10
领券