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

Objective C子类,它覆盖了超类中的方法

在Objective-C中,子类可以继承父类的方法和属性,并且可以根据需要重写或扩展这些方法。子类可以通过在子类中实现相同的方法名来覆盖父类中的方法,这样当子类调用这个方法时,将会执行子类中的实现,而不是父类中的实现。

例如,假设我们有一个父类Animal,它有一个名为speak的方法,如下所示:

代码语言:objective-c
复制
@interface Animal : NSObject
- (void)speak;
@end

@implementation Animal
- (void)speak {
    NSLog(@"Animal speaks");
}
@end

我们可以创建一个子类Dog,并重写speak方法:

代码语言:objective-c
复制
@interface Dog : Animal
@end

@implementation Dog
- (void)speak {
    NSLog(@"Dog barks");
}
@end

在上面的例子中,我们在Dog类中重写了speak方法,当我们调用speak方法时,将会执行Dog类中的实现,而不是Animal类中的实现。

需要注意的是,当子类重写父类中的方法时,应该遵循父类方法的命名和参数列表,以确保子类可以正确地覆盖父类中的方法。此外,子类应该在需要的时候调用父类中的方法,以确保父类中的方法可以正确地执行。

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

相关·内容

objective-C 的OOP(下)-类(static)方法、实例方法、overwrite(覆写)、属性(property)

对应的,还有一个-(void)dealloc方法用来释放资源(类似于析构函数或c#中的dispose()方法)-注:dealloc方法以后在内存管理中详细学习,这里先不管它。...foodName; -(void) setMarried:(BOOL)m; -(BOOL) Married; @end 实现部分: 注意下面的:setMarried 与 Married 就是obj-C中属性的标准写法...; if (self==[super init]){ sex = FALSE; married = FALSE; } return (self); } //overwrite父类中的toString...; //调用类的“静态”方法 [Human toString]; NSLog(@"----------------"); //创造一个Human的实例 Human *man = [...Human new]; //调用man的showSex方法 [man showSex]; NSLog(@"----------------"); //定义一个Woman子类的实例

74870

Objective-C中的集合类

下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习...在Objective-C中的集合类中主要包括不可变的数组--NSArray,  可变的数组--NSMutableArray,   不可变的字典--NSDictionary,    可变的字典--NSMutableDictionary...NSMutableArray是NSArray的子类,是对NSArray的一个扩充。             ...1.不可变集合NSSet     ​    ​    ​    ​(1)NSSet的初始化和其他集合类一样也有其对应的便利初始化方法和便利构造器,     ​    ​    ​    ​    ​    ​...OC中的集合类中是不能放基本数据类型的,那么我们如何把基本数据类型封装成对象呢?

1.1K70
  • Objective-C中NSArray类的解读

    Objective-C中NSArray类的解读     NSArray数组类是Objective-C语言中常用的也是重要的一个类,除了开发中常用到的一些基础功能,NSArray及其相关类中还封装了许多更加强大的功能...NSArray中属性与方法: //获取数组中元素个数 @property (readonly) NSUInteger count; //通过下标获数组中的元素 - (ObjectType)objectAtIndex...:(NSUInteger)index; //初始化方法 - (instancetype)init; //通过C语言风格的数组创建NSArray对象 需要注意,C数组中需要为Objective对象,cnt...- (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; //数组的下标方法 子类重写 - (ObjectType)objectAtIndexedSubscript...子类覆写 - (void)setObject:(ObjectType)obj atIndexedSubscript:(NSUInteger)idx NS_AVAILABLE(10_8, 6_0); /

    1.3K20

    objective-C中的扩展方法与partial class

    ; [str PrintToConSole]; [pool drain]; return 0; } 不过有一点要特别注意:c#中如果开发人员增加的扩展方法跟.net框架自带的现有方法重名...但在obj-C中,这种情况下开发人员新增加的重名方法会覆盖系统原有的方法,而且没有任何提示!一个好的习惯是为所有扩展方法(包括类名),都加一个特殊的前缀或后缀,以避免重名。...下一个话题:partial class 做过asp.net开发的程序员都知道,c#中的partial class可以方便的将同一个类的代码,分散在多个不同的物理文件中,编译器在编译时能自动将它们合并。...表面上看,partial class与扩展方法是风马牛不相及的二个概念,但是在obj-C中,这二个其实是一回事。...productNo:0001 皆大欢喜,很多语言和技术真是“一门通,处处通”,也许:c#中的"扩展方法"与"部分类"的设计灵感正是来自objective-C。

    86470

    创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?

    static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象的时候父类会调用子类方法...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

    6.2K10

    面向对象程序设计中“超类”和“子类”概念的来历

    众所周知,在面向对象程序设计中,子类从超类中继承数据成员和成员方法,然后在此基础上再根据实际需要进行扩展并增加属于子类的数据成员和成员方法。...也就是说,子类的对象比超类的对象具有更加丰富的属性,或者具有更多的行为。或者说,子类的功能比超类的功能更加强大。那么为什么不把子类叫做超类呢? ?...实际上,超类和子类的概念来自于集合论,借鉴了超集和子集的概念。子集中的所有元素都属于其超集,而超集中并不是所有元素都属于子集。...同理,在面向对象程序设计中,所有子类对象都属于其超类的实例,而反过来则是不成立的。 ?

    1.5K40

    objective-C 的OOP(上)--类定义、继承及方法调用

    上一篇展示了如何用传统的“面向过程编程方法”,实现画“矩形”、“圆”、“椭圆”,这一篇看下如何改用OOP的方法来实现: 因为要用到“颜色”以及“矩形区域”二个枚举,先把他们抽出来单独放在CommDef.h...结构 typedef struct { int x,y,width,height; } ShapeRect; 然后再定义基类Shape,注意:在obj-C中,定义一个类通常分成二部分,一部分是".h"...的文件,用来申明类有哪些成员(也称为类的定义文件,类似于接口),另一部分是".m"的文件,用来提供具体实现 Shape类的申明部分如下:(Shape.h) // // Shape.h // HelloWorld...@",bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]); } @end 注:上面展示了在obj-C中如何调用父类的方法...,在obj-C中id相当于“任意类型”,意为指向某对象的指针(哪怕你不知道这个对象是什么类型),总之,如果你不知道某对象的具体类型时,用它就对了。

    1.2K80

    【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )

    一、继承机制中派生类中的 static 关键字 1、子类继承父类静态成员 子类继承父类静态成员 : 父类 ( 基类 ) 中 使用 static 关键字 定义的 静态成员变量 , 可以被所有的 子类 (...派生类 ) 共享 ; 2、父类静态成员访问控制权限的改变 继承自 父类的 静态成员变量 , 仍然遵循 继承中 子类的 访问控制特性 , public 公有继承 : 父类成员 在 子类 中 , 访问控制权限...不变 , 共有 和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 仍然是 public 成员 ; 父类中的 protected 成员 仍然是 protected...和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 protected 成员 ; 父类中的 protected 成员 仍然是 protected...都不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 private 成员 ; 父类中的 protected 成员 变为 子类中的 private 成员 ; 父类中的 private

    54710

    关于使用MethodHandle在子类中调用祖父类重写方法的探究

    关于使用MethodHandle在子类中调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...这里直接看Son类的thinking方法(关于为何这样实现,在《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)中也解释了)。...在普通的方法调用中,这个this参数是虚拟机自动处理的,表示的是当前实例对象,我们在方法中可以直接使用。...基于这个事实,我们这时可以直接在GrandFather的thinking方法中调用Son类独有的方法,使用反射或者直接类型强制转换为Son就行了。...这个参数中指定的是方法接收者的类型,bindTo指定的接收者的类型必须要是这个类或子类,不然会出现ClassCastException异常。

    9.5K30

    c++中ostream类的超详细说明

    根据前文,ostream类是c++标准输出流的一个基类,本篇详细介绍ostream类的主要成员函数用法。...ostream类与istream类一样,它的的拷贝构造函数和赋值函数也都是保护类型的,所以ostream是不允许拷贝或者赋值的,所以它也不能直接作为返回类型和参数传递,很多时候需要使用引用来进行传递。...3.put函数 ostream头文件中put函数原型如下: //往缓冲区中插入一个字符 __ostream_type& put(char_type __c); put.../a.out c=X [root@mylinux ~]# 4.write函数 ostream的write函数原型如下: //将__s指针所指向的字符串复制出来并插入到缓冲区中,最多插入_.../a.out aaa [root@mylinux ~]# 5.flush函数 函数原型如下: //将数据从缓冲区同步到存储介质中 __ostream_type& flush(); 使用方法如下

    3.1K30

    c++中istream类的超详细说明

    根据前文,istream类是c++标准输入流的一个基类,本篇详细介绍istream类的主要成员函数用法。...& __c); //从输入流中读取字符存储在__s指向的内存中,直到输入流被读取完或者读到了__n-1个字符才返回,其中如果在读取字符的过程中遇到了__delim所代表的字符,则提前返回,也就是说...//查看输入流中的下一个字符,但不会从输入流中取出来,字符指针位置也不会发生变化,就是看一眼 int_type peek(); 使用方法如下: #include <iostream...7.putback函数、unget函数、sync函数 函数原型如下: //将前面从输入流中读取的字符__C返回到输入流,插入到当前指针位置,注意返回的字符一定要是之前读取过的,否则是不起作用的...__istream_type& putback(char_type __c); //恢复上一个被读取的字符,重新放回到输入流中,恢复到它原本所在的位置

    1.5K30

    C#中的类、方法和属性

    这节讲C#中的类,方法,属性。这是面向对象编程中,我们最直接打交道的三个结构。...需要注意的是,在执行类的构造方法之前,会先执行其父类的无参的构造方法,或者,我们指定父类的有参的构造,因为子类继承了父类,在实例化子类的时候,必定要将继承自父类的成员也在内存中创建出来,注意,这并非是实例化父类...),也可以定义非抽象方法,它的作用就是将类中的成员进行抽象,以便更好地实现多态。...方法是可以重载的,所谓重载,就是一个类中可以存在相同方法名的方法,C#中,方法名和参数列表组成一个方法签名,重载一个方法,只需要修改方法签名中的参数列表即可。...关于方法,还有一个知识点,叫方法的重写,它跟继承有关,如果想重写父类的方法,那么父类的方法,就要设置为virtual也就是虚方法,子类重写,需要使用关键字override。

    2K30

    objective-C中的Class(类类型),Selector(选择器SEL),函数指针(IMP)

    今天在园子里看到了一篇牛文“Objective-C 2.0 with Cocoa Foundation--- 5,Class类型,选择器Selector以及函数指针 ”,讲得十分精彩,忍不住把它的代码加上注释整理于此...个人体会:obj-C中的“Class类型变量”比c#中的Object基类还要灵活,可以用它生成任何类型的实例(但是它又不是NSObject)。...而选择器SEL与函数指针IMP,如果非要跟c#扯上关系的话,这二个结合起来,就点类似c#中的反射+委托,可以根据一个方法名称字符串,直接调用方法。...) void(*setSkinColor_Func)(id,SEL,NSString*); //定义一个IMP方式的函数指针(obj-C中推荐的方式) IMP say_Func; //定义一个类...:skin])//如果aCattle对应的是类中,有定义方法"setSkinColor" { [aCattle performSelector:skin withObject:color];/

    1.8K51

    父类中如果没有无参构造方法(也即父类中只给了带参构造方法),子类的构造方法怎么办?

    父类中如果没有无参构造方法(也即父类中只给了带参构造方法),子类的构造方法怎么办? /* 父类中如果没有无参构造方法(也即父类中只给了带参构造方法),子类的构造方法怎么办?   ...法1:子类的构造方法通过 super(...); 去显示调用父类的带参构造方法。   ...法2:子类的构造方法通过 this();/this(...); 调用本类的其他的构造方法,但是子类的其他的构造方法中一定会有一个去访问了父类的带参构造方法。   法3:让父类提供无参构造。...;/super(...); 这三个语句访问子类或父类的构造方法的时候,必须放在第一句语句上。         否则,就可能会对父类数据进行多次初始化。 */ 示例代码如下图所示: ?

    1.5K10

    一个简单的方法:截取子类名称中不包含基类后缀的部分

    基类是 MenuItem,子类是 WalterlvMenuItem、FooMenuItem。...在代码中,我们可能会为了能够一眼看清类之间的继承(从属)关系而在子类名称后缀中带上基类的名称。但是由于这种情况下的基类不参与实际的业务,所以对外(文件/网络)的名称通常不需要带上这个后缀。...本文提供一个简单的方法,让子类中基类的后缀删掉,只取得前面的那部分。 在这段代码中,我们至少需要获得两个传入的参数,一个是基类的名称,一个是子类的名称。...33 using System; namespace Walterlv.Utils { /// /// 包含类名相关的处理方法。...在截取完子串之后,我们还需要验证截取的字符串是否已经是空串了,因为父子类的名称可能是完全一样的(虽然这样的做法真的很逗比)。

    23230

    c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法「建议收藏」

    GetActiveWindow 函数功能:该函数可以获得与调用该方法的线程的消息队列相关的活动窗口的窗口句柄(就是取得当前进程的活动窗口的窗口句柄)。...GetSafeHwnd 函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数。...FindWindow: HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName ); 参数: lpClassName 指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子...如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。...这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。

    2.5K30

    Objective-C 中 9 种避免使用 Xcode 预处理器宏的方法

    C++ 程序员们已经深有体会:" "。不幸的是,还有很多的 Objective-C 程序员尚未领悟到这一点。 本文是Objective-C 中的代码气味系列文章中的一篇。...只不过,这次我们定义的是一个常量字符串,它实际上是一个对象,在 Objective-C 中表示为指针。因此,我们要定义一个常量指针。...基本策略是将包含项目特定代码的方法改写为模板方法(Template Methods),由项目特定的子类提供项目特定的操作。 步骤 为每个项目变量创建一个子类。 在每个项目中,为该项目添加子类。...创建一个工厂方法,使用 #if 创建正确的子类。(我们引入预处理器的一种用法,这样就可以消除其他用法)。 找到每个实例化原始类的地方。让它调用工厂方法。 编译和测试每个项目。...对于每个有条件编译的部分: 执行提取方法,确定所需的签名。 将主体的每个平台特定部分向下移动到平台特定子类,直到基类的方法为空。 编译和测试每个项目。 查找每个子类内部以及子类之间的重复代码。

    14610

    Kotlin语法基础之继承

    如果没有open注解,比如Base的nv(),那么在子类中是不能覆写该方法的。在一个final类中(没有open注解声明),open成员是禁止的。...也就是说final类的每个成员也都是final的。 一个标记为override的成员自身就是open的,子类仍然可以覆写它。如果你想禁止覆写,那么使用final关键字。...覆写属性和覆写方法基本类似;如果子类要重新声明父类中已经声明过的属性,那么需要使用override,并且类型要兼容。...在Kotlin中,实现继承由以下规则控制:如果类从其直接超类继承同一成员的多个实现,则它必须覆盖该成员并提供自己的实现(可能使用其中一个继承)。...总结 Kotlin中的类默认是final的,如果需要子类继承,需要使用open修饰; Kotlin中的方法默认是不允许复写的,只有用open修饰时,子类才可以进行覆写,并且需要使用override进行显示标注

    87690
    领券