首页
学习
活动
专区
工具
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的中文意思是一对,这里也就是一对类,那这一对类是谁呢?

2.1K30

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

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

9.2K40
  • KVO详解(二)

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

    72231

    2021年web前端面试集锦

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

    40130

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

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

    22920

    Python面向对象

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

    78610

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

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

    56520

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

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

    1.1K50

    Python 中使用私有成员的子类化

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

    10110

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

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

    3K100

    跟着来,你也可以手写VueRouter

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

    1.6K40

    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.6K80

    大厂前端面试考什么?

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

    34670

    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作为父类 新式类和经典类在多继承时,会影响到方法的搜索顺序 提示:

    38120

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

    Java的setter方法 ---- 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_Ho的Android

    94410

    面试iOS 机会在自己手中

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

    54851

    程序员面试时这样介绍自己的项目经验,成功率能达到98.99%

    2.当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。...,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法 5.键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey...当观察对象A时,KVO机制动态创建一个新的名为: NSKVONotifying_A的新类,该类继承自对象A的本类,且KVO为NSKVONotifying_A重写观察属性的setter 方法,setter...方法会负责在调用原 setter 方法之前和之后,通知所有观察对象属性值的更改情况。...但是此时如果我们创建一个新的名为“NSKVONotifying_A”的类(),就会发现系统运行到注册KVO的那段代码时程序就崩溃,因为系统在注册监听的时候动态创建了名为NSKVONotifying_A的中间类

    97610
    领券