首页
学习
活动
专区
工具
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]; //调用manshowSex方法 [man showSex]; NSLog(@"----------------"); //定义一个Woman子类实例

69970

Objective-C集合

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

1.1K70

Objective-CNSArray解读

Objective-CNSArray解读     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.2K20

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

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

6.1K10

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

83270

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-Cid相当于“任意类型”,意为指向某对象指针(哪怕你不知道这个对象是什么类型),总之,如果你不知道某对象具体类型时,用它就对了。

1.2K80

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

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

1.4K40

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

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

30110

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

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

9.4K30

c++istream详细说明

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

1.2K30

c++ostream详细说明

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

2.6K30

C#方法和属性

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

1.9K30

objective-CClass(类型),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

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

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

20230

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

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

2.2K30

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

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

1.5K10

Kotlin语法基础之继承

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

82490

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

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

7710
领券